MySQL數據庫——表的約束(非空約束、唯一約束、主鍵約束、外鍵約束)

目錄

1 表的約束

1.1 非空約束:not null

1.2 唯一約束:unique,值不能重複

1.3 主鍵約束:primary key

1.4 外鍵約束:foreign key


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 

本文爲博主原創文章,轉載請註明出處!

若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!

祝君升職加薪,鵬程萬里!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章