SQL的约束作用,创建与删除

为提高检索效率,如非查过全部列,最好使用select *。

1.约束概述

1.1 为什么需要约束?什么是约束?

1)为了保证数据的完整性,防止错误和无效信息的输入输出。
2)约束是对表中字段的强制规定。

1.2 约束的分类:

角度1:约束的字段的个数
单列约束 vs 多列约束

角度2:约束的作用范围
列级约束:声明此约束声明在对应字段的后面

表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束

角度3:约束的作用或功能

① not null (非空约束)

② UNIQUE 唯一约束,用来限制某个字段/某列的值不能重复,但是如果没有非空约束,则可以由null且可有多个。添加唯一性约束,列上也会自动创建唯一索引。

③ PRIMARY KEY 主键(非空且唯一)约束,一个表中最多只能有一个主键约束。

④ AUTO_INCREMENT(自增列),主键使用自增列的字段上添加0或null,实际上会自动地往上添加指定的值。

⑤ FOREIGN KEY 外键约束:限定某个表的某个字段的引用完整性(由于外键约束容易触发级联更新,不适合分布式和高并发集群,所以有些公司不让使用,将外键概念放在应用层去处理,但还是要知道的)。

⑥ CHECK 检查约束:检查某个字段的值是否符合xx要求,一般指的是值的范围。

⑦ DEFAULT 默认值约束:给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。

1.3 如何添加约束?

CREATE TABLE时添加约束

ALTER TABLE时增加约束、删除约束

1.4 删除约束

not null(非空约束)、AUTO_INCREMENT(自增列)、DEFAULT(默认约束)使用以下方式删除(修改)约束

ALTER TABLE 表名
MODIFY 列名 数据类型

UNIQUE(唯一约束)、PRIMARY KEY(主键约束)使用以下方式删除约束

ALTER TABLE 表名
DROP ****

2.如何查看表中的约束

SELECT * FROM information_schema.`TABLE_CONSTRAINTS`
WHERE table_name = 'employees';	
或
DESC employees;

在这里插入图片描述

3. not null 非空约束

3.1在造表的时候添加约束

CREATE TABLE IF NOT EXISTS test_1(
id INT NOT NULL,
last_name VARCHAR(20) NOT NULL,
email VARCHAR(40),
salary DECIMAL(10, 2)
)

报错:Column ‘last_name’ cannot be null
INSERT INTO test_1()
VALUES (1, NULL, ‘s@163.com’, 35000);
报错: Column ‘id’ cannot be null
INSERT INTO test_1()
VALUES (NULL, ‘Tom’, ‘s@163.com’, 35000);
报错:Field ‘last_name’ doesn’t have a default value
INSERT INTO test_1(id, email,salary)
VALUES (2,‘s@163.com’, 33000);

3.2在ALTER TABLE时添加约束

ALTER TABLE test_1
MODIFY email VARCHAR(40) NOT NULL;

3.3在ALTER TABLE时删除约束

ALTER TABLE test_1
MODIFY email VARCHAR(40) NULL;

4. UNIQUE(唯一性约束):

在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。

4.1在create table 时添加约束

CREATE TABLE test_2(
id INT  UNIQUE NOT NULL, # 列级约束
last_name VARCHAR(20) NOT NULL,
email VARCHAR(40),
salary DECIMAL(10, 2),
# 表级约束
CONSTRAINT uk_test2_email UNIQUE(email)
);

INSERT INTO test_2
VALUES(1,‘张三’,‘zs@qq,com’, 5000);
报错:Duplicate entry ‘1’ for key 'test_2.id’
INSERT INTO test_2
VALUES(1,‘李四’,‘ls@qq,com’, 5000);

除非已经声明非空约束,否则可以向声明为unique的字段上添加null值,而且可以多次添加,
INSERT INTO test_2
VALUES(2,‘李四’,NULL, 5000);

INSERT INTO test_2
VALUES(3,‘王五’,NULL, 5000);

4.2在ALTER TABLE时添加约束

alter table 表名称 add unique key(字段列表);

ALTER TABLE test_2
ADD CONSTRAINT un_test_sal UNIQUE(salary);

4.3利用表约束,同时声明复合唯一性约束

CREATE TABLE test_3(
id INT,
salary DECIMAL(10, 2),
last_name VARCHAR(10),
CONSTRAINT u_test_3 UNIQUE(salary, last_name)
)

salary,last_name有一个与其他不一样就行,可以应用在不重名但充薪资情况和重名但薪资不同情况。

4.4在ALTER TABLE时删除约束

删除唯一约束只能通过删除唯一索引的方式删除。
删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样
如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同,如上salary。也可以自定义唯一性约束名。

ALTER TABLE test_2
DROP INDEX last_name;

ALTER TABLE test_2
DROP INDEX un_test_sal;

5.PRIMARY KEY 约束

作用:用来唯一标识表中的一行记录。
主键约束相当于唯一约束+非空约束的组合

5.1在create table时添加主键约束

CREATE TABLE test_4(
id INT  PRIMARY KEY, # 列级约束
last_name VARCHAR(20),
email VARCHAR(40),
salary DECIMAL(10, 2)
);

CREATE TABLE test_5(
id INT, 
last_name VARCHAR(20),
email VARCHAR(40),
salary DECIMAL(10, 2),
CONSTRAINT p_test_4 PRIMARY KEY(id) # 表级约束。没有必要起名字
);

复合的主键约束

注意:如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复(单个值可以重复,如下只重复last_name是可以的)。

CREATE TABLE employee1(
id INT, 
last_name VARCHAR(20),
email VARCHAR(40),
salary DECIMAL(10, 2),
CONSTRAINT p_test_4 PRIMARY KEY(id, last_name) # 表级约束。
);

5.2在ALTER TABLE时添加主键约束

CREATE TABLE ttt666(
id INT, 
last_name VARCHAR(20),
email VARCHAR(40),
salary DECIMAL(10, 2)
);
ALTER TABLE ttt666
ADD PRIMARY KEY(id);

5.3如何删除主键约束:(在实际开发中,通常不会删除表中的主键约束)

ALTER TABLE ttt666
DROP PRIMARY KEY;

6. 自增列:AUTO_INCREMENT

当向主键(带AUTO_INCREMENT)的字段上添加0或null,实际上会自动地往上添加指定的值。
开发中,一旦主键作用的字段上声明有AUTO_INCREMENT,则我们在添加数据时,就不要给主键对应的字段去赋值嘞。

6.1在create table时添加AUTO_INCREMENT

CREATE TABLE ttt667(
id INT PRIMARY KEY AUTO_INCREMENT, 
last_name VARCHAR(20),
email VARCHAR(40),
salary DECIMAL(10, 2)
);

6.2 在ALTER TABLE时添加AUTO_INCREMENT

CREATE TABLE ttt668(
id INT , 
last_name VARCHAR(20),
email VARCHAR(40),
salary DECIMAL(10, 2)
);
ALTER TABLE ttt668
ADD PRIMARY KEY(id);

ALTER TABLE ttt668
MODIFY id INT AUTO_INCREMENT;

6.3在ALTER TABLE时删除

ALTER TABLE ttt668
MODIFY id INT;

6.4Mysql8.0新特性-自增变量的持久化

在MySQL 5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护 ,并不会持久化到磁盘中。
MySQL 8.0将自增主键的计数器持久化到重做日志中。

7.FOREIGN KEY 约束

外键特点

(1)为什么从表的外键列,必须引用/参考主表的主键或唯一约束的列?
因为被依赖/被参考的值必须是唯一的

(2)在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名(例如student_ibfk_1;),也可以指定外键约束名。(最好指定外键约束名,好记)

(3)创建(CREATE)表时就指定外键约束的话,先创建主表,再创建从表

(4)删表时,先删从表(或先删除外键约束),再删除主表

(5)当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据

(6)在“从表”中指定外键约束,并且一个表可以建立多个外键约束

(7)从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。如果类
型不一样,创建子表时,就会出现错误“ERROR 1005 (HY000): Can’t create table’database.tablename’(errno: 150)”。
例如:都是表示部门编号,都是int类型。

(8)当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束
名。(根据外键查询效率很高)

(9)删除外键约束后,必须 手动 删除对应的索引

一切外键概念必须在应用层解决。

说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发 ,不适合分布式 、高并发集群 ;级联更新是强阻塞,存在数据库 更新风暴 的风险;外键影响数据库的 插入速度 。

8. CHECK约束(mysql5.7及以前不支持check约束,8.0之后支持check约束)

作用:检查某个字段的值是否符合xx要求,一般指的是值的范围

CREATE TABLE test12(
id INT PRIMARY KEY AUTO_INCREMENT, 
last_name VARCHAR(20),
salary DECIMAL(10, 2) CHECK (salary > 2500)
)

INSERT INTO test12(last_name, salary)
VALUES (‘张三’, 15000);
报错:Check constraint ‘test12_chk_1’ is violated.
INSERT INTO test12(last_name, salary)
VALUES (‘里三’, 1000);

9.DEFAULT约束

作用:给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。

9.1使用create table创建约束

CREATE TABLE test13(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20),
email VARCHAR(40) NOT NULL DEFAULT'待补充'
);

9.2使用alter table创建约束

CREATE TABLE test14(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20),
email VARCHAR(40)
);

ALTER TABLE test14
MODIFY email VARCHAR(40) DEFAULT '待补充';

9.3使用alter table删除默认约束

ALTER TABLE test13
MODIFY email VARCHAR(40);
  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SYBYy6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值