constraint

  • 约束:数据完整性指的是数据的精确性和可靠性。
  • 为了保证数据的完整性,对表数据进行额外的条件限制

    • 实体完整性
    • 域完整性
    • 引用完整性
    • 用户自定义完整性
  • 约束:表级的强制规定

    • 在创建表示规定约束

约束

什么是约束?

  • 对表中字段的限制

约束的分类:

  • 角度1:约束的字段的个数
    • 单列约束
    • 多列约束
  • 角度2:约束的作用范围
    • 列级约束:将此约束声明在对应字段的后面
    • 表级约束:在表中所有字段都声明完后,在所有字段的后面声明的约束
  • 角度3:约束的作用
    • not null(非空约束)
    • unique(唯一性约束)
    • primary key(主键约束)
    • foreign key(外键约束)
    • check(检查约束)
    • default(默认值约束)

如何添加约束

  1. CREATE TABLE 时添加约束
  2. ALTER TABLE 时添加、删除约束

如何查看表中约束

  1. SELECT * FROM information_schema.table_constraints
  2. WHERE table_name = '表名称';

非空约束(not null)

  • 限定某个字段的值是否允许为空
  • 关键字:NOT NULL

在CREATE TABLE时添加约束

  1. CREATE TABLE test1(
  2. id INT NOT NULL,
  3. last_name VARCHAR(15) NOT NULL,
  4. email VARCHAR(15),
  5. salary DECIMAL(10,2)
  6. )
  7. DESC test1
  1. INSERT INTO test1(id,last_name,email,salary)
  2. VALUES(1,'Tom','tom@126.com',3400)
  3. # 错误:Column 'last_name' cannot be null
  4. INSERT INTO test1(id,last_name,email,salary)
  5. VALUES(2,NULL,'tom@126.com',3400)

在ALTER TABLE时添加约束

  1. ALTER TABLE test1
  2. MODIFY email VARCHAR(25) NOT NULL

在ALTER TABLE时删除约束

  1. ALTER TABLE test1
  2. MODIFY email VARCHAR(25) NULL

唯一性约束(unique)

  • 用来限制某个字段/某列的值不能重复
  • 关键字:UNIQUE

在 create table时添加约束

  1. CREATE TABLE test2(
  2. id INT UNIQUE, # 列级约束
  3. last_name VARCHAR(15),
  4. email VARCHAR(25),
  5. salary DECIMAL(10,2),
  6. # 表级约束
  7. CONSTRAINT uk_test2_email UNIQUE(email)
  8. );
  9. DESC test2
  • 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同

  • 可以向声明为unique的字段上添加null值。而且可以多次添加null

在 alter table时添加约束

  • 方式1:

    1. ALTER TABLE test2
    2. ADD CONSTRAINT uk_test_sal UNIQUE(salary);
  • 方式2:

    1. ALTER TABLE test2
    2. MODIFY last_name VARCHAR(15) UNIQUE;

复合的唯一性约束

  1. CREATE TABLE USER(
  2. id INT,
  3. `name` VARCHAR(15),
  4. `password` VARCHAR(25),
  5. #表级约束
  6. CONSTRAINT uk_user_name_pwd UNIQUE(`name`,`password`)
  7. );
  1. INSERT INTO USER
  2. VALUES(1,'Tom','abc');
  3. #可以添加成功
  4. INSERT INTO USER
  5. VALUES(1,'Tom1','abc');
  • 复合的唯一性约束的案例

    1. #学生表
    2. create table student(
    3. sid int, #学号
    4. sname varchar(20), #姓名
    5. tel char(11) unique key, #电话
    6. cardid char(18) unique key #身份证号
    7. );
    8. #课程表
    9. create table course(
    10. cid int, #课程编号
    11. cname varchar(20) #课程名称
    12. );
    13. #选课表
    14. create table student_course(
    15. id int,
    16. sid int, #学号
    17. cid int, #课程编号
    18. score int,
    19. unique key(sid,cid) #复合唯一
    20. );

    删除唯一性约束

  • 添加唯一性约束的列上也会自动创建唯一索引

  • 删除唯一约束只能通过删除唯一索引的方式删除
  • 删除时需要指定唯一索引名
  • 如果创建唯一约束时未指定名称,如果时单列,就默认和列名相同;如果时组合列,那么默认和()中排第一个列名的相同
  1. ALTER TABLE USER
  2. DROP INDEX uk_name_pwd;

主键约束(primary key)

  • 用来唯一表示表中的一行记录
  • 关键字:primary key
  • 主键约束列不允许重复,也不允许出现空值
  • 一个表中最多只能有一个主键约束

  • 主键约束特征:

    • 非空且唯一,用于唯一的标识表中的一条记录

在create table时添加约束

  1. CREATE TABLE test3(
  2. id INT PRIMARY KEY, #列级约束
  3. last_name VARCHAR(15),
  4. salary DECIMAL(10,2),
  5. email VARCHAR(25)
  6. );
  1. CREATE TABLE test3(
  2. id INT,
  3. last_name VARCHAR(15),
  4. salary DECIMAL(10,2),
  5. email VARCHAR(25),
  6. #表级约束
  7. CONSTRAINT pk_test5_id PRIMARY KEY(id) #没有必要起名字
  8. );
  • MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用

  • 如果时多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复

    1. CREATE TABLE user1(
    2. id INT,
    3. `name` VARCHAR(15),
    4. `password` VARCHAR(25),
    5. PRIMARY KEY(`name`,`password`)
    6. );

在alter table中添加主键约束

  1. CREATE TABLE test6(
  2. id INT,
  3. last_name VARCHAR(15),
  4. salary DECIMAL(10,2),
  5. email VARCHAR(25)
  6. );
  7. DESC test6;
  8. ALTER TABLE test6
  9. ADD PRIMARY KEY (id);

删除主键约束

  • 在实际开发中,不会删除主键约束
    1. ALTER TABLE test6
    2. DROP PRIMARY KEY;

自增列(auto_increment)

  • 某个字段的值自增
  • 关键字:auto_increment

在create table时添加

  1. CREATE TABLE test7(
  2. id INT PRIMARY KEY,
  3. last_name VARCHAR(15) UNIQUE AUTO_INCREMENT
  4. );
  • 当我们向主键(含auto_increment)的字段上添加0或Null时,实际上会自动的网上添加指定的字段的数值
  • 一旦主键作用的字段上声明有auto_increment,则我们在添加数据时,就不要给主键对应的字段去赋值了

在alter table时添加

  1. CREATE TABLE test8(
  2. id INT PRIMARY KEY,
  3. last_name VARCHAR(15)
  4. );
  5. ALTER TABLE test8
  6. MODIFY id INT AUTO_INCREMENT;

在alter table时删除

  1. ALTER TABLE test8
  2. MODIFY id INT;

自增变量的持久化

外键约束(foreign key)

  • 限定某个表的某个字段的引用完整性
    • 例如:员工表的员工所在的部门,必须在部门表中能找到

CHECK约束

  • 用来检查某个字段的值是否符合xx要求,一般是指值的范围
  • 关键字:check
  • mysql5.7不支持check约束。
  1. CREATE TABLE test10(
  2. id INT,
  3. last_name VARCHAR(15),
  4. salary DECIMAL(10,2) CHECK(salary > 2000)
  5. );
  1. INSERT INTO test10 //成功
  2. VALUES(1,'Tom',2500)

DEFAULT约束

  • 当没有赋值时,设置默认值
  1. CREATE TABLE test10(
  2. id INT,
  3. last_name VARCHAR(15),
  4. salary DECIMAL(10,2) DEFAULT 2000
  5. );

面试

  1. 为什么建表时加