初識Mysql(part14)--我需要知道的6個關於創建表的小知識

學習筆記,以代碼和例子堆砌而成,方便查閱。
參考書籍:《Mysql必知必會》等
要點:CREATE TABLE、主鍵、NULL、AUTO_INCREMENT、默認值、引擎


  • 創建一個表

Mysql不僅用於表數據操控,還可以用來執行數據庫和表的所有操作,包括表本身的創建和處理。

我們利用CREATE TABLE語句創建一個叫test01的表:

CREATE TABLE test01(id int AUTO_INCREMENT,
pro_version int NOT NULL,
price int NULL,
pro_num int NULL,
PRIMARY KEY (id))ENGINE=InnoDB;

如果創建新表時,表名已經存在了,那麼mysql就會報錯。比如我們在Mysql中重新輸入上面的表創建語句,看一下運行信息:

Error Code: 1050. Table 'test01' already exists

mysql報出錯誤信息,並提示我們test01表已經存在了。


如果我們僅僅想在一個表不存在時創建它,需要在TABLE關鍵字後給出IF NOT EXISTS。這樣做不是檢查已有的表的模式是否與我們打算創建的表的模式相匹配,而是查看錶名是否存在,並僅在表名不存在時創建它。

我們再創建一個叫test01的表(這個表和先前創建的test01表的模式不同),並使用IF NOT EXISTS

CREATE TABLE IF NOT EXISTS test01(id int AUTO_INCREMENT,
pro_version int NOT NULL,
price int NULL,
PRIMARY KEY (id))ENGINE=InnoDB;

運行信息:

0 row(s) affected, 1 warning(s): 1050 Table 'test01' already exists

我們看到mysql沒有報錯,只是給了警告,告訴我們,test01表已經存在了。


  • 使用NULL值

所謂NULL值就是沒有值或缺失值,允許NULL值的列也允許在插入行時不給出該列的值。不允許NULL值的列不接受該列出現沒有值的行,換句話說,在插入或更新行時,該列必須有值。

創建test02表,其中除id列,所有列都允許NULL值

CREATE TABLE test02(id int NOT NULL AUTO_INCREMENT,
pro_version int NULL,
price int NULL,
pro_num int NULL,
PRIMARY KEY (id));

注意!不要把NULL值與空串相互混淆,空串是一個有效的值,它不是無值,如果指定''那麼在NOT NULL中是允許的。


  • 主鍵 PRIMARY KEY

表中的每個行必須有唯一的主鍵值。如果主鍵使用單個列,則它的值必須唯一;如果使用多個列,則這些列的組合值必須唯一。

我們創建test03表,並指定兩列爲主鍵

CREATE TABLE test03(
pro_version int NOT NULL,
price int NOT NULL,
pro_num int NULL,
PRIMARY KEY (pro_version,price));

注意!主鍵中不能出現有NULL值的列,所以允許NULL值的列不能作爲主鍵,否則就會報錯。比如:

CREATE TABLE test04(
pro_version int NOT NULL,
price int NOT NULL,
pro_num int NULL,
PRIMARY KEY (price,pro_num));

運行信息:

Error Code: 1171. All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead

我們看到運行信息裏一句話if you need NULL in a key, use UNIQUE instead,它表示如果我們想要鍵中存在NULL值,則可以使用唯一約束UNIQUE來替代。

這個UNIQUE是啥呢? 唯一約束(Unique Key),即要求被設置的列的值必須唯一,索引列的值允許有空值,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複值。

我們試一下這個UNIQUE:

CREATE TABLE test04(
pro_version int NOT NULL,
price int NOT NULL,
pro_num int NULL,
UNIQUE KEY (price,pro_num));

運行結果:

15:37:06	CREATE TABLE test04( pro_version int NOT NULL, price int NOT NULL, pro_num int NULL, UNIQUE KEY (price,pro_num))	0 row(s) affected	0.093 sec

我們看到沒有報錯。

那麼UNIQUE和PRIMARY有啥區別和聯繫呢?

筆者在網上找到了一張較爲直觀、清晰的表


  • AUTO_INCREMENT關鍵字

如果設置某列爲AUTO_INCREMENT的話,那麼AUTO_INCREMENT將高速Mysql,本列每增加一行時自動增量。每次執行一個INSERT操作時,Mysql自動對該列增量。每個表只允許一個AUTO_INCREMENT列,並且它必須被索引。

PS:上面創建的表裏面都有AUTO_INCREMENT關鍵字,這裏就不舉例了。


  • 設置默認值

創建test05表,除了主鍵以外,都設置默認值。

CREATE TABLE test05(id int NOT NULL AUTO_INCREMENT,
pro_version int NOT NULL DEFAULT 0,
price int NOT NULL DEFAULT 0,
PRIMARY KEY (id));

我們試着向test05表中添加數據行

INSERT INTO test05(price) values (10);

查看錶:

# id, pro_version, price
'1', '0', '10'

可以看到,雖然我們在插入數據時,沒有填入pro_version的值,但是mysql還是自動幫我們填入了默認值0


  • 引擎

可以看到,我們在創建test01表時,在代碼末尾是以ENGINE=InnoDB結束的,它表示我們將使用InnoDB引擎去管理和處理數據。

Mysql中有很多引擎,我們可以按照自己的需求,去選擇引擎。以下是幾個常用的引擎:

引擎 特點
InnoDB 支持事務;外鍵約束;不支持全文搜索;適合處理多重併發的更新請求
Memory 功能等同於MyIsam,由於數據存儲在內存中,速度快
MyIsam 不支持事務;不支持外鍵;查詢速度很快;對錶進行加鎖;支持全文搜索
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章