为提高检索效率,如非查过全部列,最好使用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);

SQL的约束作用,创建与删除相关推荐

  1. 【第11天】SQL进阶-索引的创建、删除(SQL 小虚竹)

    回城传送–><32天SQL筑基> 文章目录 零.前言 一.练习题目 二.SQL思路 SQL进阶-索引的创建.删除:SQL121 创建索引 初始化数据 解法 扩展 SQL进阶-索引的创 ...

  2. SQL约束和字段约束的创建和删除

    1)禁止所有表约束的SQL select 'alter table '+name+' nocheck constraint all' from sysobjects where type='U' 2) ...

  3. SQL SERVER 2约束的创建,删除,重命名

    文章目录 删除有依赖列 创建表的时候添加约束 len获取字符串长度 between 添加约束 删除约束 sys.objects 查看当前表中有哪些约束 查看约束信息(ID,type,name) 约束重 ...

  4. Mysql外键约束的创建与删除

    在Mysql中使用外键,可以有效地将多个表格的数据"联动"起来,打破独立状态,互相影响. 文章目录 创建表时创建外键 给存在的表添加外键 删除外键约束 创建表时创建外键 创建两个表 ...

  5. mysql sql语句临时表_mysql 创建与删除临时表sql语句

    临时表可能是非常有用的,在某些情况下,保持临时数据.最重要的是应该知道的临时表是,他们将当前的客户端会话终止时被删除 当你创建临时表的时候,你可以使用temporary关键字.如: 代码如下 crea ...

  6. 使用sql语句创建和删除约束示例代码

    使用sql语句创建和删除约束  约束类型 主键约束(Primary Key constraint) --:要求主键列数据唯一,并且不允许为空.  唯一约束(Unique constraint) --: ...

  7. SQL Server触发器创建、删除、修改、查看

    http://blog.csdn.net/tianwailaibin/article/details/8111766 本教程为大家介绍SQL Server触发器创建.删除.修改.查看方法. 一.触发器 ...

  8. 利用SQL语句创建、删除、修改和查看数据表

    [技术导图] 1.连接Mysql服务:mysql -u root -p; 2.使用数据库:use teacherdb; 3.创建student表(无约束条件):create table student ...

  9. 2019-7-26 [MySQL] 安装与介绍 语句分类/语法 数据类型 DDL数据定义:创建/查看/删除/使用 DML数据操作:增删改 主键约束 自动增长列 非空约束 默认值 Navicat

    文章目录 0.知识回顾 1.数据库介绍 1.1 数据库概述 1.1.1 什么是数据库 1.1.2 什么是数据库管理系统 1.1.3 数据库与数据库管理系统的关系 1.2 数据库表 1.3 表数据 1. ...

最新文章

  1. Struts2与Struts的区别
  2. 整数数组查找java_使用Java编写程序以查找整数数组中的第一个非重复数字?
  3. html5 head 标签
  4. h264的码率控制 JVT-G012
  5. 深入理解SpringBoot(3)
  6. 什么是智能决策支持系统?
  7. 13.docker exec
  8. 创建hadoop账号
  9. 【045】HTML初学
  10. 笔记本电脑怎样截屏_被辞退,我是怎样一步步打赢仲裁官司,拿到70万赔偿的(一)--纠纷起源...
  11. Keil5(C51,MDK)注册详细教程(2032年版本)
  12. 【使用51单片机驱动1.54英寸墨水屏做一个简洁的贪吃蛇游戏】
  13. 什么时候做都不晚——十大大器晚成的人物
  14. 基于5G网络的远程控制机器人应用及测试
  15. db4小波的一次分解与重构
  16. 有限差分方法的matlab编程,有限差分方法的MATLAB编程(1)
  17. 图象淡入淡出(VB6)
  18. webRTC(十二):webrtc 传输速率控制
  19. maven项目搭建步骤
  20. Super Map超图IServer加载BIM及精细模型操作

热门文章

  1. 基础篇:9)装配流程图
  2. 3D打印技术分类浅析
  3. 深入学习 jQuery 选择器系列第三篇——过滤选择器之索引选择器 - 小火柴的蓝色理想 - 博客园...
  4. 使用DSFD检测DarkFace数据集过程
  5. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)
  6. 用html写消费记录页面,收支明细查询.html
  7. [PTA]实验8-2-5 判断回文字符串
  8. 【Servlet】Servlet 详解(使用+原理)
  9. java通过js实现生成二维码(最强攻略!)
  10. 搭建vue+webpack 项目