相关文章推荐
耍酷的骆驼  ·  贝叶斯神经网络,用MC ...·  1 年前    · 
爱玩的小笼包  ·  如何使用VBA循环遍历数据透视表字段,并根据 ...·  1 年前    · 
博学的豌豆  ·  mysql ...·  1 年前    · 
慷慨的铁板烧  ·  vue项目中实现pdf文件预览功能 - 简书·  1 年前    · 
潇洒的紫菜汤  ·  RMS 的软件要求 | Microsoft ...·  1 年前    · 
Code  ›  MySQL数据库——表的约束(非空约束、唯一约束、主键约束、外键约束)开发者社区
https://cloud.tencent.com/developer/article/1705109
从容的大脸猫
10 月前
Winter_world

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

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
Winter_world
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > MySQL数据库——表的约束(非空约束、唯一约束、主键约束、外键约束)

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

作者头像
Winter_world
发布 于 2020-09-25 11:05:18
13.7K 0
发布 于 2020-09-25 11:05:18
举报
文章被收录于专栏: 技术小屋-未分类

目录

1 表的约束

约束,是对表中的数据进行限定,保证数据的正确性、有效性和完整性,约束分为以下几类:

  • 主键约束:primary key
  • 非空约束:not null
  • 唯一约束:unique
  • 外键约束:foreign key

1.1 非空约束:not null

1)在创建表时添加约束:

代码语言: javascript
复制
CREATE TABLE stu(
	id INT,
	NAME VARCHAR(20) NOT NULL -- name为非空
);

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

代码语言: javascript
复制
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL; 

3)删除name的非空约束:

代码语言: javascript
复制
ALTER TABLE stu MODIFY NAME VARCHAR(20)

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

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

代码语言: javascript
复制
CREATE TABLE stu(
	id INT,
	number VARCHAR(20) UNIQUE
);

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

2)删除唯一约束:

代码语言: javascript
复制
-- alter table stu modify number varchar(20); 不同于非空约束的删除方法
ALTER TABLE stu DROP INDEX number;

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

代码语言: javascript
复制
ALTER TABLE stu MODIFY number VARCHAR(20) UNIQUE;

1.3 主键约束:primary key

1)注意:

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

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

代码语言: javascript
复制
CREATE TABLE stu(
	id INT PRIMARY KEY,
	number VARCHAR(20)
);

3)删除主键

代码语言: javascript
复制
-- 错误方式 ALTER TABLE stu MODIFY id int;
ALTER TABLE stu DROP PRIMARY KEY;

4)创建完表后添加主键

代码语言: javascript
复制
ALTER TABLE stu MODIFY id INT PRIMARY KEY;

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

  • 在创建 表时添加主键约束,且完成主键自增长
代码语言: javascript
复制
CREATE TABLE stu(
	id INT PRIMARY KEY AUTO_INCREMENT,
	number VARCHAR(20)
);
  • 删除自动增长
代码语言: javascript
复制
ALTER TABLE stu MODIFY id INT;
  • 创建后,添加自动增长
代码语言: javascript
复制
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 主表名称(主表主键名称)         );

代码语言: javascript
复制
-- 创建部门表(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;
 
推荐文章
耍酷的骆驼  ·  贝叶斯神经网络,用MC dropout来近似,是每一层卷积都要用dropout吗? - 知乎
1 年前
爱玩的小笼包  ·  如何使用VBA循环遍历数据透视表字段,并根据特定条件更改特定单元格的数字格式? -火山引擎
1 年前
博学的豌豆  ·  mysql 查看字段有空格的_mob649e815a6b81的技术博客_51CTO博客
1 年前
慷慨的铁板烧  ·  vue项目中实现pdf文件预览功能 - 简书
1 年前
潇洒的紫菜汤  ·  RMS 的软件要求 | Microsoft Learn
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号