mysql約束學習

約束:對錶中的數據進行限定,保證數據的正確性、有效性和完整性。

如果給表中添加了一條數據,年齡字段有值, 而姓名字段無值,這樣的數據不太好,所以要對數據庫表做約束。

分類:

    1.主鍵約束:primary key

        1.注意:

               1.含義:非空且唯一。

               2.一張表只能有一個字段爲主鍵。

               3.主鍵就是表中記錄的唯一標識。

               4.自動增長:

                    概念:如果某一列是數值類型的,使用auto_increment可以完成值得自動增長。

                   

CREATE TABLE stu3 (
	id INT PRIMARY KEY AUTO_INCREMENT, -- 給id添加主鍵約束
	NAME VARCHAR(20)
)

-- 刪除自動增長
ALTER TABLE stu MODIFY id INT;

-- 添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
CREATE TABLE stu1(
	id INT PRIMARY KEY, -- 給id添加主鍵約束
	NAME VARCHAR(20)
)

-- 刪除主鍵
-- alter table stu1 modify id int; // 錯的
ALTER TABLE stu1 DROP PRIMARY KEY;

-- 創建完表後,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
 
 
SELECT * FROM stu1;

 

    2.非空約束:not null

-- 創建表添加非空約束
CREATE TABLE yueshu (   
	id INT,  -- 編號   
	NAME VARCHAR(20) NOT NULL -- name 爲非空
); 

-- 刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);

-- 創建表完成後,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
SELECT * FROM stu;

    3.唯一約束:unique (那一列的數據不能有重複,比如說電話號碼等)

CREATE TABLE stu (
	id INT,
	phone_number VARCHAR(20) UNIQUE --  添加了唯一約束
);

-- 注意mysql中,唯一約束限定的列的值可以有多個null

-- 刪除唯一約束

-- ALTER TABLE stu MODIFY phone_number VARCHAR(20); // 沒用
ALTER TABLE stu DROP INDEX phone_number;

-- 在創建表後,添加唯一約束

ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

    4.外鍵約束:foreign key 讓表與表產生關係,從而保證數據的正確性。

        1.在創建表時,可以添加外鍵。

        *語法:

                create table 表名(

                        ...

                        外鍵列

                        constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)

                )

    新建兩張表:

    部門表:

    

    人員表:

比如說現在需要撤銷廣州的研發部,但是人員表裏面的前三個人信息就是歸屬於研發部的,這樣數據就不符合邏輯了。

如下給員工表添加外鍵。可以保證部門可以不被隨意刪除。

-- 解決方案:分成 2 張表
-- 創建部門表(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_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
);

 

刪除外鍵:

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;

-- 刪除外鍵
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES department(主列表名稱);

-- 添加外鍵
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id);

 

 

約束級聯操作

需求:想改某個部門的id,則其他關聯這個id的數據也要變化纔行,否則就有歧義。

笨辦法:

1.現將關聯數據的部門字段變爲null (UPDATE employee SET dep_id = NULL WHERE dep_id = 1;)

2.手動將部門表的id修改掉:

3.再將員工表dep_id爲null的變爲5

UPDATE employee SET dep_id = 5 WHERE dep_id IS NULL;

 

上面這個笨辦法太麻煩了,想着修改部門id,則關聯的數據會跟着變化。

可以添加外鍵過程中設置級聯更新 就是部門id變了 員工的部門id也會跟着變

-- 添加外鍵,並設置級聯更新
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE;

可以添加外鍵過程中設置級聯更新 就是部門id變了 員工的部門id也會跟着變,刪除了部門,則員工也會跟着刪除

ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;

這種級聯刪除的操作其實有利有弊。

 

 

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