06-MySQL(約束)
阿新 • • 發佈:2020-12-30
技術標籤:MySQL
1- 約束種類
約束名 | 約束關鍵字 |
---|---|
主鍵 | primary key |
非空 | not null |
唯一 | unique |
外來鍵 | foreign key … references |
預設 | default |
2-約束的作用
約束通常是在建立表結構的時候建立的,表中約束防止不符合要求的資料新增到表中,保證表中資料的正確性。如果表中已經有違反約束的資料,會導致約束建立失敗。
3- 主鍵約束
3.1 主鍵特點
唯一標識表中每一條記錄,通過主鍵來查詢到每一條記錄。
主鍵的特點:
1.非空:不能為NULL
2.唯一:不能重複
3.2 欄位作為表的主鍵
通常是能夠唯一代表這條記錄的欄位,儘量不要使用與業務相關的主鍵。如:身份證,學生證, 最好這個主鍵是沒有意義。
3.3 複合主鍵
一張表中如果有多列做為主鍵,稱為複合主鍵。需要通過多列才能唯一標識表中一行記錄。只要這幾列加到一起不重複就可以了。
3.4 建立主鍵
1.在建立表的時候給欄位新增主鍵
create table 表名(
欄位名字 資料型別 primary key
)
2.在已有表中新增主鍵,修改表結構
alter table 表名 add primary key(列名)
案例語句
-- 使用資料庫
USE test1;
-- 建立學生表stu4,包括欄位(id, name, age)將id作為主鍵
CREATE TABLE stu4(
id INT PRIMARY KEY,
NAME VARCHAR(20),
age INT
);
-- 插入主鍵值
INSERT INTO stu4 VALUES(1, "張三", 18);
INSERT INTO stu4 VALUES(2, "小劉", 21);
INSERT INTO stu4 VALUES(3, "李剛", 51);
INSERT INTO stu4 VALUES(4, "科比", 41);
-- 刪除stu4表的主鍵
ALTER TABLE stu4 DROP PRIMARY KEY;
-- 表存在的情況下,新增主鍵
ALTER TABLE stu4 ADD PRIMARY KEY(id);
SELECT * FROM stu4;
-- stu4的結構
DESC stu4;
3.5主鍵自增長
由系統自動增長主鍵,不需要人為新增主鍵的值避免重複,auto_increment只能用在主鍵上,不能用在其它的欄位上。
語法:
create table 表名(
欄位名字 數字型別 primary key auto_increment
)
案例語句
-- 建立學生表st5, 包含欄位(id, name, age)將id做為主鍵並自動增長
CREATE TABLE stu5(
id INT PRIMARY KEY auto_increment,
NAME VARCHAR(20),
age INT
);
-- 插入資料
INSERT INTO stu5(`NAME`, age) VALUES("張三", 10);
INSERT INTO stu5(`NAME`, age) VALUES("李四", 23);
-- 將主鍵的起始值設定為100
ALTER TABLE stu5 auto_increment = 100;
-- 查詢stu5
SELECT * FROM stu5;
-- stu5結構
DESC stu5;
-- 刪除自增長的值(資料表)
DELETE FROM stu5;
-- 刪除表中所有記錄
TRUNCATE stu5;
4- 唯一約束
指定某一列不能出現相同的值.
語法:
create table 表名(
欄位名 欄位型別 unique
)
案列語句
-- 建立學生表st6,包含欄位(id,name),NAME這一列設定唯一約束,不能出現同名的學生
CREATE TABLE stu6(
id int,
NAME VARCHAR(20) UNIQUE
);
-- 表結構
DESC stu6;
-- 新增資料
INSERT INTO stu6 VALUES(1, "張三");
-- 再次新增
# INSERT INTO stu6 VALUES(2, "張三"); -- 插入失敗, Duplicate entry '張三' for key 'name'
-- 刪除資料
DELETE from stu6 WHERE id = 1;
-- 查詢表資料
SELECT * FROM stu6;
5- 非空約束
設定某列資料不能為空,必須要輸入。
語法格式:
create table 表名(
欄位名, 欄位型別 not null
)
案列語句
# 非空約束
-- 建立表學生表st7, 包含欄位(id,name,gender)其中name不能為NULL
CREATE TABLE stu7(
id INT,
NAME VARCHAR(20) NOT NULL,
age INT
);
-- 查看錶結構
DESC stu7;
-- 新增一條記錄其中姓名不賦值
# INSERT INTO stu7 VALUES(1, NULL, 20); -- 1048 - Column 'NAME' cannot be null
# INSERT INTO stu7(id, age) VALUES(1, 30); -- 1364 - Field 'NAME' doesn't have a default value
-- 新增資料
INSERT INTO stu7 VALUES(1, "李四", 20);
-- 查詢表中資料
SELECT * FROM stu7;
6- 預設值約束
如果一個欄位沒有設定它的值,將使用預設值。
語法格式:
create table 表名(
欄位名 欄位型別 default 預設值
)
案列語句
# 預設值約束
-- 建立一個學生表,包含欄位(id, name, address),地址預設值是廣州
CREATE TABLE stu5(
id INT,
NAME VARCHAR(20),
address VARCHAR(30) DEFAULT "廣州"
);
-- 查看錶結構
DESC stu5;
-- 新增一條記錄,使用預設地址
INSERT INTO stu5(id, `NAME`) VALUES(1, "劉菲");
INSERT INTO stu5 VALUES (2, "侯大利", DEFAULT);
-- 新增一條記錄,不使用預設地址
INSERT INTO stu5 VALUES(3, "楊帆", "深圳");
-- stu5表資訊
SELECT * FROM stu5;
-- 刪除id=3的記錄
DELETE FROM stu5 WHERE id = 3;
7-外來鍵約束
7.1 建立外來鍵
新表建立時候新增外來鍵
create table 表名 (
外來鍵欄位名 欄位型別,
constraint 約束名 foreign key(外來鍵欄位名)references 主表(主鍵)
)
已有表新增外來鍵
alter table 表名 add constraint 約束名 foreign key(外來鍵欄位名) references 主表(主鍵)
7.2 刪除外來鍵
alter table 從表 drop foreign key 約束名;
案例語句
USE db3;
-- 資料庫所有表
SHOW TABLES;
-- 部門表
CREATE TABLE department(
id INT PRIMARY KEY auto_increment, -- 部門表主鍵
dep_name VARCHAR(10), -- 部門名
dep_location VARCHAR(20) -- 部門所在城市
);
-- 新增部門表的記錄
insert into department values(null,'刑警部', '江州'),(null, '法醫部', '陽州');
-- 員工表
CREATE TABLE employee(
id INT PRIMARY KEY auto_increment, -- 主鍵自增長
NAME VARCHAR(20), -- 姓名
age INT,
dept_id INT -- 外來鍵,引用部門表中的主鍵
-- CONSTRAINT fk_ep_id FOREIGN KEY(dept_id)REFERENCES department(id)
);
-- 刪除外來鍵
alter table employee drop foreign key fk_ep_id;
-- 新增從表存在的情況下新增外來鍵
alter TABLE employee ADD constraint fk_ep_id FOREIGN KEY(dept_id) REFERENCES department(id);
# 向員工表中新增元素
INSERT INTO employee (NAME, age, dept_id) VALUES ('侯大利', 27, 1);
INSERT INTO employee (NAME, age, dept_id) VALUES ('朱琳', 50, 1);
INSERT INTO employee (NAME, age, dept_id) VALUES ('張小天', 30, 1);
INSERT INTO employee (NAME, age, dept_id) VALUES ('田甜', 26, 2);
INSERT INTO employee (NAME, age, dept_id) VALUES ('老李', 42, 2);
INSERT INTO employee (NAME, age, dept_id) VALUES ('樊勇', 35, 2);
-- 查詢部門表資訊
SELECT * FROM department;
-- 查詢員工表資訊
SELECT * FROM employee;
-- 刪除表結構
DROP table department;
DROP table employee;
7.3 級聯操作
語法:
寫在外來鍵約束的後面,在建立外來鍵約束的時候建立級聯操作。
級聯操作 | 語法 |
---|---|
級聯更新 | on update cascade |
級聯刪除 | on delete cascade |
案例語句
-- 刪除外來鍵約束
ALTER TABLE employee DROP FOREIGN KEY fk_ep_id;
-- 新增外來鍵約束,級聯更新和級聯刪除
ALTER TABLE employee ADD CONSTRAINT fk_ep_id FOREIGN KEY(dep_id) REFERENCES department(id) ON UPDATE ON DELETE CASCADE;
SELECT * from employee;
-- 刪除員工表id=6的值
DELETE FROM employee WHERE id = 6;
-- 把部門表中id等於2的部門改成id等於3
UPDATE department set id=3 WHERE id=2
-- 刪除部門號是3的部門
DELETE FROM department WHERE id = 3;
-- 查詢部門表資訊
SELECT * FROM department;