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;

这种级联删除的操作其实有利有弊。

 

 

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