目錄
1 表的約束
約束,是對錶中的數據進行限定,保證數據的正確性、有效性和完整性,約束分爲以下幾類:
- 主鍵約束:primary key
- 非空約束:not null
- 唯一約束:unique
- 外鍵約束:foreign key
1.1 非空約束:not null
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 VARCHAR(20)
1.2 唯一約束:unique,值不能重複
1)創建表時添加唯一約束:
CREATE TABLE stu(
id INT,
number VARCHAR(20) UNIQUE
);
注意:MySQL中唯一約束限定的列的值可以有多個null
2)刪除唯一約束:
-- alter table stu modify number varchar(20); 不同於非空約束的刪除方法
ALTER TABLE stu DROP INDEX number;
3)創建表後添加唯一約束:
ALTER TABLE stu MODIFY number VARCHAR(20) UNIQUE;
1.3 主鍵約束:primary key
1)注意:
- 若某一列添加了該約束,則代表了非空,且唯一;
- 一張表只能有一個字段爲主鍵;
- 主鍵就是表中記錄的唯一標識;
2)創建表時添加主鍵約束
CREATE TABLE stu(
id INT PRIMARY KEY,
number VARCHAR(20)
);
3)刪除主鍵
-- 錯誤方式 ALTER TABLE stu MODIFY id int;
ALTER TABLE stu DROP PRIMARY KEY;
4)創建完表後添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
5)自動增長:若某一列是數值類型的,使用關鍵字auto_increment 可以來完成值得自動增長。
- 在創建 表時添加主鍵約束,且完成主鍵自增長
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT,
number VARCHAR(20)
);
- 刪除自動增長
ALTER TABLE stu MODIFY id INT;
- 創建後,添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
1.4 外鍵約束:foreign key
【引例】我們創建一張職工表如下,但是發現存在明顯的缺陷:
- 數據冗餘;
- 後期還會出現增刪改的問題;
所以,基於以上問題,我們可以通過拆表解決,一張員工表,一張部門表,員工表中的dep_id 對應部門表中的id
以上仍然存在一個問題,當在員工表中輸入不存的部門時,數據依然可以添加,不符合實際,因此,這裏就可以通過使用外鍵約束來解決。
【概念】什麼是外鍵約束?
外鍵,就是從表中與主表主鍵對應的那一列,如:員工表中的dep_id,其中,主表是一方,用來約束別人的表,從表可以是多方,被別人約束的表。
注意:外鍵可以爲NULL,但是不能是不存在的外鍵值。
1)創建表時添加外鍵
語法:
create table 表名(
...
外鍵列
constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表主鍵名稱)
);
-- 創建部門表(id,dep_name,dep_location)
-- 一方,主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 創建員工表(id,name,age,dep_id)
-- 多方,從表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT, -- 外鍵對應主表的主鍵
CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id)
); -- 外鍵對應主表的主鍵
-- 添加2個部門
INSERT INTO department VALUES(NULL, '研發部','廣州');
INSERT INTO department VALUES(NULL, '銷售部','深圳');
-- 添加員工,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);
SELECT * FROM employee;
SELECT * FROM department;
因爲有外鍵的約束,在員工表中添加一個不在部門表範圍內的內容,則無法保存:
2)刪除外鍵:ALTER TABLE 表名稱 DROP FOREIGN KEY 外鍵名稱;
-- 刪除外鍵
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
3)在創建表後添加外鍵:
ALTER TABLE 表名稱 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);
-- 添加外鍵
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id);
4)級聯操作
若希望改動部門表的id,同時希望自動改動員工表中的id,這時就需要進行級聯操作,需要在添加外鍵的時候設置級聯:
- 添加級聯操作:ALTER TABLE 表名稱 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE ;
- 分類:級聯更新 ON UPDATE CASCADE
級聯刪除 ON DELETE CASCADE
本文爲博主原創文章,轉載請註明出處!
若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!
祝君升職加薪,鵬程萬里!