1. 程式人生 > 實用技巧 >欄位的約束條件

欄位的約束條件

一 欄位的約束條件
          控制如何給欄位賦值
                 Null | Key | Default | Extra |                             
                                       Null : 是否允許為空 預設為yes
                                       Key  : MySQL 鍵值
                                       Default:當插入數值時,不插入資料時的預設值
                                       EXtra:額外設定,自動增長
1.1 Null和Default的使用
                                          #建立表結構db2.t7,健表過程中使用約束條件
mysql> use db2;
mysql> create table t7(                                                                        
 -> name char(15) not null,
    -> age tinyint unsigned default 25,
    -> class char
(9) not null default "nsd1904", -> sex enum("man","woman") default "man", -> pay float(7,2) default 28000 -> ); mysql> desc t7; +-------+---------------------+------+-----+----------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+----------+-------+
| name | char(15) | NO | | NULL | | | age | tinyint(3) unsigned | YES | | 25 | | | class | char(9) | NO | | nsd1904 | | | sex | enum('man','woman') | YES | | man | | | pay | float(7,2) | YES | | 28000.00 | | +-------+---------------------+------+-----+----------+-------+ 5 rows in set (0.00 sec) mysql> #使用預設值賦值的方法給表中欄位賦值 #賦值時有default的欄位,如果沒有指定數值則會使用預設值 mysql> insert into t7(name) values("bob"); Query OK, 1 row affected (0.11 sec) mysql> select * from t7; +------+------+---------+------+----------+ | name | age | class | sex | pay | +------+------+---------+------+----------+ | bob | 25 | nsd1904 | man | 28000.00 | +------+------+---------+------+----------+ 1 row in set (0.01 sec) mysql> #注意:賦空值與不賦值是不一樣的 #空值的值是NULL #不賦值時使用預設值default mysql> insert into t7 values("jerry",NULL,"NSD1905","man",3800); Query OK, 1 row affected (0.09 sec) mysql> insert into t7(name,class,sex,pay) values("xixi","NSD1905","man",8000); Query OK, 1 row affected (0.09 sec) mysql> select * from db2.t7; +-------+------+---------+------+----------+ | name | age | class | sex | pay | +-------+------+---------+------+----------+ | bob | 25 | nsd1904 | man | 28000.00 | | jerry | NULL | NSD1905 | man | 3800.00 | | xixi | 25 | NSD1905 | man | 8000.00 | +-------+------+---------+------+----------+ 3 rows in set (0.00 sec) mysql> 1.2 Extra:自動增長 auto_increment 它必須和主鍵一起使用才生效 #建立db2.t6表,把Id設定為主鍵並設定自動增長 mysql> use db2; mysql> create table t6( -> id int primary key auto_increment, -> name char(10), -> age int, -> sex enum("w","m") -> ); mysql> desc t6; +-------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(10) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | enum('w','m') | YES | | NULL | | +-------+---------------+------+-----+---------+----------------+ #第一次新增記錄時,自增長是0+1,後續記錄的id值會自動增長 mysql> insert into t6(name,age,sex)values("bob",19,"m"); mysql> insert into t6(name,age,sex)values("tom",21,"m"); mysql> select * from t6; +----+------+------+------+ | id | name | age | sex | +----+------+------+------+ | 1 | bob | 19 | m | | 2 | tom | 21 | m | #第二條記錄的ID會自動增長為2 +----+------+------+------+ #後續再增加記錄時,如果不想使用id為3,則可以手動指令ID的值 #只要不和已有衝突且是增加的即可 mysql> insert into t6 values(6,"alice",21,"m") mysql> delete from t6; #清空表記錄 mysql> select * from t6; #再次使用自動增加時,它會以清除之的最後一個id值6開始自動 #增長而不是重新從0開始 1.3 MySQL 鍵值型別 - 鍵值的作用是為了欄位賦值時做限制的,根據資料儲存要求來決定要不要用鍵值,用什麼型別的鍵值。
因為是對欄位做限制的,所以這個鍵值是要放在欄位上的。
index 普通索引 unique 唯一索引 不常用 fulltext 全文索引 不常用 primary key 主鍵 foreign key 外來鍵 1.3.1 普通索引 使用索引的主機目的是:提高查詢資料的速度。
優點: 通過建立索引,可以保證資料庫中第一行數的唯一可以加快資料的查詢速度 缺點: 對錶中資料進行增 刪 改的時候,索引也要跟著調整,降低了維護速度佔用物理空間 使用規則: 一個表中可以有多個index欄位; 欄位的值可以重複,也可以NULL; 通常把做為查詢條件的欄位為index欄位; index標誌是MUL ---------------------------------------------------------------------------------- (1)建表的時候建立索引 使用index()函式,如果沒有指定索引的名字,那麼索引名同欄位名。
#建立表tea4,同時指定索引name,id mysql
> create table tea4( -> id int, -> name char(1), -> class char(9), -> pay float, -> index(name),index(id) -> ); mysql> desc tea4; #檢視索引的標誌 +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | MUL | NULL | | | name | char(1) | YES | MUL | NULL | | | class | char(9) | YES | | NULL | | | pay | float | YES | | NULL | | +-------+---------+------+-----+---------+-------+ mysql> show index from tea4\G; #檢視索引的詳細資訊 *************************** 1. row ************** Table: tea4 #表名 Non_unique: 1 Key_name: name #索引名 Seq_in_index: 1 Column_name: name Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE #二叉樹演算法 Comment: Index_comment: ------------------------------------------------------------------------ (2)在已有表中建索引 mysql> create index xxx on t7(name); #在t7表中為name欄位建立一個名為xxx的索引 mysql> create index age on t7(age); #索引名和欄位同名

(3)刪除索引 #刪除t7表中名字為xxx的索引 mysql
> drop index xxx on t7; mysql> drop index age on t7; (4)檢視索引: 刪除索引之前如果不知道索引的名字需要先查詢索引 mysql> show index from 表名\G; (5)驗證查詢資料時是否使用了索引: explain select * from 表名 where 欄位="值" ========================================================================

1.3.2 primary key 主鍵 使用規則: 欄位不允許重複,且不允許為NULL; 一個表中只能有一個primary key; 如果要使多個欄位都作為主鍵,可以用複合主鍵,必須一起建立; 通常會把表中唯一標識記錄的欄位設定為主鍵,一般用行號ID; 主鍵通常與auto_increment連用,讓欄位使用自增長方式賦值; 主鍵標誌PRI; ------------------------------------------------------------------------
(1)建表的時候同時建立主鍵
一旦指定為主鍵,該欄位就自動為能為NULL
mysql
> use db2; mysql> create table t8( -> name char(10) primary key, -> id int -> ); mysql> desc t8; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | name | char(10) | NO | PRI | NULL | | | id | int(11) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ -------------------------------------------------------------------------- (2)在已有表中建立主鍵 #在t7表中把class欄位新增為主鍵 mysql> alter table t7 add primary key (class); (3)刪除主鍵 mysql> alter table t7 drop primary key; -------------------------------------------------------------- (4)複合主鍵(多個欄位一起做主鍵) 多個欄位一起做主鍵,欄位的值不同時重複就可以,複合主鍵必須一起建立; 主鍵要一起建立,只有全部主鍵欄位內容全部重複時,才算重複.
使用場景:兩個欄位中的任意欄位數值可以重複,但兩個欄位的數值加起來必須唯一, 比如:埠號
+IP地址,姓名+班級。 #在t5表中把欄位name,class一起建立複合主鍵, mysql> create table t5( -> name char(10), -> class char(7), -> status enum("yes","no"), -> primary key(name,class) -> ); mysql> desc t5; +--------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------------------+------+-----+---------+-------+ | name | char(10) | NO | PRI | NULL | | | class | char(7) | NO | PRI | NULL | | | status | enum('yes','no') | YES | | NULL | | +--------+------------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> mysql> select * from t5; +------+---------+--------+ | name | class | status | +------+---------+--------+ | bob | nsd1904 | yes |---> | bob | nsd1906 | no |---> #不同時重複不算重複,可以儲存成功. | tom | nsd1904 | yes | +------+---------+--------+ 3 rows in set (0.00 sec) mysql> =========================================================================

1.3.3 foreign key 外來鍵 作用: 外來鍵也是約束給欄位賦值的; 插入記錄時,欄位的值在另一個表字段值範圍內選擇; 使用規則: 兩個表的儲存引擎必須是innodb; 兩個欄位型別要一致; 被參照欄位必須要是索引型別的一種(通常是primary key)

------------------------------------------------------------------------------ #先建立員工資訊表yginfo,id欄位使用自動增長。 mysql> create table yginfo( -> yg_id int primary key auto_increment, -> name char(20) -> )engine=innodb; mysql> insert into yginfo(name) values("bob"); mysql> insert into yginfo(name) values("alice"); mysql> insert into yginfo(name) values("tom"); mysql> select * from yginfo; +-------+-------+ | yg_id | name | +-------+-------+ | 1 | bob | | 2 | alice | | 3 | tom | +-------+-------+ (1) 建立工資表,同時建立外來鍵 #建立gzb表,其中gz_id做為外來鍵,該外來鍵參考yginfo表中
#的yg_id mysql
> create table gzb( -> gz_id int, -> pay float(7,2), -> foreign key(gz_id) references yginfo(yg_id) -> on update cascade -> on delete cascade -> )engine=innodb; (2) 檢視這個表中是否有外來鍵: mysql> show create table gzb \G; *************************** 1. row *************************** Table: gzb #表名 Create Table: CREATE TABLE `gzb` ( `gz_id` int(11) DEFAULT NULL, `pay` float(7,2) DEFAULT NULL, KEY `gz_id` (`gz_id`), CONSTRAINT `gzb_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES #外來鍵欄位的外來鍵名稱是 gzb_ibfk_1 `yginfo` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec) (3)外來鍵的同步更新: mysql> select * from gzb; +-------+----------+ | gz_id | pay | +-------+----------+ | 1 | 50000.00 | | 2 | 40000.00 | | 3 | 30000.00 | +-------+----------+ #更新yginfo中的yg_id時,那麼gbz中的yz_id也會變化 mysql> update yginfo set yg_id=8 where yg_id=2; mysql> select * from gzb;; +-------+----------+ | gz_id | pay | +-------+----------+ | 1 | 50000.00 | | 8 | 40000.00 | #2已更新為8 | 3 | 30000.00 | +-------+----------+ (4)外來鍵的同步刪除: #刪除yginfo表中的yg_id=3的記錄時,gzb中的相關聯的記錄
#也會自動刪除 mysql
> delete from yginfo where yg_id=3; mysql> select * from gzb; +-------+----------+ | gz_id | pay | +-------+----------+ | 1 | 50000.00 | | 8 | 40000.00 | +-------+----------+ ---------------------------------------------------------------------------------- (5)刪除外來鍵: alter table 表名 drop foreign key 外來鍵名; #刪除gzb中的外來鍵,使它不再受yginfo表中資料的約束 mysql> alter table gzb drop foreign key gzb_ibfk_1; mysql> show create table gzb\G; *************************** 1. row ***************** Table: gzb Create Table: CREATE TABLE `gzb` ( `gz_id` int(11) DEFAULT NULL, `pay` float(7,2) DEFAULT NULL, KEY `gz_id` (`gz_id`) #外來鍵資訊已刪除 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)