MySql約束
Content
概念:
對錶中的數據進行限定,保證數據的正確性、有效性和完整性。
分類:
- 主鍵約束:primary key
- 非空約束:not null
- 唯一約束:unique
- 外鍵約束:foreign key
(一)非空約束:not null
SELECT DATABASE(); -- 查看當前的數據庫
-- 1.創建表時添加約束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name爲非空
);
-- 2.創建表完了之後,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
-- 3.刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARBINARY(20);
SELECT * FROM stu;
(二)唯一約束:unique
DROP TABLE stu; -- 刪掉,重新建表
-- 1.在建表時添加:唯一約束
CREATE TABLE stu(
id INT,
phone VARCHAR(20) UNIQUE -- 添加唯一約束,法一
);
-- 2.在建表完後,添加唯一約束:
ALTER TABLE stu MODIFY phone VARCHAR(20) UNIQUE; -- 此時也可以添加約束唯一,法二
-- 3.刪除唯一約束:(注意:和刪除非空約束的方法不同)
ALTER TABLE stu DROP INDEX phone ;
(三)主鍵約束:表中各記錄的唯一標識,必須非空
-- 1.創建表時,添加主鍵約束
CREATE TABLE stu(
id INT PRIMARY KEY, -- 給id添加主鍵約束:
NAME VARCHAR(20)
);
-- 2.創建表之後,再添加主鍵約束
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
-- 3.刪除主鍵約束:[方法比較特殊]
ALTER TABLE stu DROP PRIMARY KEY;
(四)外鍵約束
(1)單表的缺點:數據冗餘
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30), age INT,
dep_name VARCHAR(30),
dep_location VARCHAR(30)
);
-- 添加數據
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('張三', 20, '研發部', '廣州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研發部', '廣州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研發部', '廣州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '銷售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '銷售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '銷售部', '深圳');
SELECT * FROM emp; -- 此表數據較爲冗餘
(2)解決辦法:拆分成兩個表
1.從表中,使用外鍵關聯主表中的主鍵
2.級聯操作,在修改和更新主表的主鍵時,同時更新或刪除從表的外鍵值
-- 1.創建主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 添加2個部門
INSERT INTO department VALUES(NULL, '研發部','廣州'),(NULL, '銷售部', '深圳');
SELECT * FROM department;
-- 2. 創建員工表
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) -- 外鍵約束:只能出現與主表中一致的主鍵id
ON UPDATE CASCADE ON DELETE CASCADE -- 級聯操作,在修改和更新主表的主鍵時,同時更新或刪除附表的外鍵值
)
-- 添加員工,dep_id表示員工所在的部門
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);