欄位的約束條件
阿新 • • 發佈:2020-06-29
一 欄位的約束條件
控制如何給欄位賦值
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)