MySQL筆記-約束
阿新 • • 發佈:2022-03-17
1 資料庫表的約束
1.1 約束種類
約束名 | 關鍵字 |
---|---|
主鍵 | primary key |
唯一 | unique |
非空 | not null |
外來鍵 | foreign key |
1.2 主鍵
-
主鍵的性質
- 關鍵字: primary key
- 特點:
- 非空
- 唯一
-
主鍵的建立
2.1 建立表時新增主鍵欄位名 欄位型別 PRIMARY KEY
2.2 在已有的表中新增主鍵ALTER TABLE 表名 ADD PRIMARY KEY(欄位名);
- 例:
--建立表t1 create table t1( id int primary key, name varchar(20), age int ); desc t1; -- 插入值(此時id的值不能為null) inset into t1 values(1,'張三',20); --刪除主鍵 alter table t1 drop primary key; --新增主鍵 alter table t1 add int primary key(id);
2.3 主鍵自增長
AUTO_INCREMENT 表示自動增長(欄位型別必須是整數型別)
- 語法:
-- 建立表時建立 CREATE TABLE 表名( 列名 int primary key AUTO_INCREMENT ) [AUTO_INCREMENT=起始值]; -- 建立好後修改 alter table 表名 AUTO_INCREMENT=起始值;
1.3 唯一約束
表中某一列不能出現重複的值
- 格式:
欄位名 欄位型別 UNIQUE;
- 注
- null值沒有資料,不存在重複的問題
1.4 非空約束
某一列值不能為null
- 格式:
欄位名 欄位型別 NOT NULL;
1.5 外來鍵約束
- 概念
- 主表:一方,用來約束其他表的表
- 從表/副表:多方,使用主表的資料,被別人約束的表
- 外來鍵: 在從表中與主表主鍵對應的那一列
- 語法
-
建立
[CONSTRAINT][外來鍵約束名稱] foreign key(外來鍵欄位名) references 主表名(主鍵欄位名);
-
修改
ALTER TABLE 從表 ADD [CONSTRAINT] [外來鍵約束名稱] FOREIGN KEY (外來鍵欄位名) REFERENCES 主表(主鍵欄位名);
-
刪除
ALTER TABLE 從表 drop foreign key 外來鍵名稱;
-
級聯操作
在修改和刪除主表的主鍵時,同時更新或刪除副表的外來鍵值,稱為級聯操作
級聯操作語法 | 說明 |
---|---|
ON UPDATE CASCADE | 級聯更新,只能是建立表的時候建立級聯關係。 更新主表中的主鍵,從表中的外來鍵列也自動同步更新 |
ON DELETE CASCADE | 級聯刪除 |
- 例:
-- 建立主表 create table department( id int PRIMARY key auto_increment, dep_name VARCHAR(128), dep_location VARCHAR(128) ); insert into department values(null, '研發部','廣州'),(null, '銷售部', '深圳'); --建立從表並新增外來鍵約束 create table employee( id int primary key auto_increment, name varchar(20), age int, dep_id int, -- 外來鍵對應主表的主鍵 -- 建立外來鍵約束並新增級聯操作 constraint emp_depid_fk foreign key (dep_id) references department(id) on update cascade on delete cascade ); -- 插入資料 INSERT INTO employee (NAME, age, dep_id) VALUES ('張三', 20, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);