MySQL数据库——表的约束(非空约束、唯一约束、主键约束、外键约束)

举报
Winter_world 发表于 2021/09/28 23:07:15 2021/09/28
【摘要】 目录 1 表的约束 1.1 非空约束:not null 1.2 唯一约束:unique,值不能重复 1.3 主键约束:primary key 1.4 外键约束:foreign key 1 表的约束 约束,是对表中的数据进行限定,保证数据的正确性、有效性和完整性,约束分为以下几类: 主键约束:primary key非空约...

目录

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)在创建表时添加约束:


  
  1. CREATE TABLE stu(
  2. id INT,
  3. NAME VARCHAR(20) NOT NULL -- name为非空
  4. );

2)创建表后再添加非空约束:

ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL
 

3)删除name的非空约束:

ALTER TABLE stu MODIFY NAME VARCHAR(20)
 

1.2 唯一约束:unique,值不能重复

1)创建表时添加唯一约束:


  
  1. CREATE TABLE stu(
  2. id INT,
  3. number VARCHAR(20) UNIQUE
  4. );

注意:MySQL中唯一约束限定的列的值可以有多个null

2)删除唯一约束:


  
  1. -- alter table stu modify number varchar(20); 不同于非空约束的删除方法
  2. ALTER TABLE stu DROP INDEX number;

3)创建表后添加唯一约束:

ALTER TABLE stu MODIFY number VARCHAR(20) UNIQUE;
 

1.3 主键约束:primary key

1)注意:

  • 若某一列添加了该约束,则代表了非空,且唯一;
  • 一张表只能有一个字段为主键;
  • 主键就是表中记录的唯一标识;

2)创建表时添加主键约束


  
  1. CREATE TABLE stu(
  2. id INT PRIMARY KEY,
  3. number VARCHAR(20)
  4. );

3)删除主键


  
  1. -- 错误方式 ALTER TABLE stu MODIFY id int;
  2. ALTER TABLE stu DROP PRIMARY KEY;

4)创建完表后添加主键

ALTER TABLE stu MODIFY id INT PRIMARY KEY;
 

5)自动增长:若某一列是数值类型的,使用关键字auto_increment 可以来完成值得自动增长。

  • 在创建 表时添加主键约束,且完成主键自增长 

  
  1. CREATE TABLE stu(
  2. id INT PRIMARY KEY AUTO_INCREMENT,
  3. number VARCHAR(20)
  4. );
  • 删除自动增长
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 主表名称(主表主键名称)
        );


  
  1. -- 创建部门表(id,dep_name,dep_location)
  2. -- 一方,主表
  3. CREATE TABLE department(
  4. id INT PRIMARY KEY AUTO_INCREMENT,
  5. dep_name VARCHAR(20),
  6. dep_location VARCHAR(20)
  7. );
  8. -- 创建员工表(id,name,age,dep_id)
  9. -- 多方,从表
  10. CREATE TABLE employee(
  11. id INT PRIMARY KEY AUTO_INCREMENT,
  12. NAME VARCHAR(20),
  13. age INT,
  14. dep_id INT, -- 外键对应主表的主键
  15. CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id)
  16. ); -- 外键对应主表的主键
  17. -- 添加2个部门
  18. INSERT INTO department VALUES(NULL, '研发部','广州');
  19. INSERT INTO department VALUES(NULL, '销售部','深圳');
  20. -- 添加员工,dep_id表示员工所在的部门
  21. INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
  22. INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
  23. INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
  24. INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
  25. INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
  26. INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
  27. SELECT * FROM employee;
  28. SELECT * FROM department;

因为有外键的约束,在员工表中添加一个不在部门表范围内的内容,则无法保存:

2)删除外键:ALTER TABLE 表名称 DROP FOREIGN KEY 外键名称;


  
  1. -- 删除外键
  2. ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

3)在创建表后添加外键:
ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);


  
  1. -- 添加外键
  2. 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 

本文为博主原创文章,转载请注明出处!

若本文对您有些许帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/106909141

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。