十、数据库约束

数据库约束简介

  • 约束(constraint),实际上就是表中数据的限制条件。表在设计时加入约束的目的就是为了保证表中的记录完整和有效
  • MySQL数据库中的约束包括:
    • 主键约束
    • 外键约束
    • 唯一约束
    • 非空约束、空值约束
    • 默认值约束

主键约束(PRIMARY KEY)

  • 通过数据表中的一个或多个属性能够标识表中的唯一一行记录,这一个或多个属性称为该表的主键(一个表只能有一个主键)

  • 主键约束的作用:

    • 定义为主键的属性不允许为空
    • 定义为主键的属性不允许输入重复值
    • 定义主键约束时,会在主键列自动创建索引,加快对主键的查询速度
  • 主键约束可以在定义表时设置,分为列级约束和表级约束

    • 列级约束:
    CREATE TABLE test_table1
    (
      id INT PRIMARY KEY,
      name VARCHAR(20),
      age INT
    );
    
    • 表级约束(如果主键由多个属性组成,则必须定义为表级约束):
    CREATE TABLE test_table1
    (
      id INT,
      name VARCHAR(20),
      age INT,
      PRIMARY KEY(id,name)
    );
    
  • 主键约束也可以在修改表时添加

    • 语法:ALTER TABLE 表名 ADD CONSTRAINT PRIMARY KEY(属性名)
  • 主键约束在不被使用时,可以从表中删除

    • 语法: ALTER TABLE 表名 DROP PRIMARY KEY

外键约束(FOREIGN KEY)

  • 建立和强调两个表之间的关联,确保数据的完整性和一致性

  • 例如:

    • A表中的属性是另外一个B表中能够唯一确定一行记录的键,A表和B表通过这个属性可以建立关联,这个属性就称为A表的外键,其中B表被称为主表或外表,A表称为从表或子表(子表中的外键可以有多个)
  • 外键约束的作用:

    • 主表中被子表外键关联的属性进行更新或删除操作,会关联到子表中的外键属性
    • 子表中的外键属性输入的数据必须是主表中被关联属性已有的值
    • 子表中的外键属性与主表中的被关联属性数据类型要一致
  • 外键约束的使用限制:

    • 主表必须已经存在
    • 主表中的主键或唯一键才能作为子表的外键关联属性
    • 定义外键约束的表类型必须是InnoDB,只有InnoDB类型的表才支持外键
    • 对于非InnoDB表,外键约束会被忽略
  • 外键约束可以在定义表时设置,但只能定义为表级约束

CREATE TABLE test_table2
(
    id INT,
    name VARCHAR(20),
    FOREIGN KEY(id) REFERENCES test_table1(id) ON DELETE CASCADE ON UPDATE CASCADE
);
  • ON DELETE/ON UPDATE指明主表中对主键进行删除/更新操作时,子表相应的动作,不指定则表示主表不能进行删除/更新操作
  • CASCADE:表明子表中外键字段值也会被更新或删除
  • SET NULL:父表更新或删除时,子表字段值设置为NULL
  • NO ACTION:父表更新或删除时,子表进行不了任何操作
  • 定义外键约束时可以为约束起名(因为一张表中可能存在多个外键,删除时需要通过名称删除)
CREATE TABLE test_table2
(
    id INT,
    CONSTRAINT fk FOREIGN KEY(id) REFERENCES test_table1(id) ON DELETE CASCADE ON UPDATE CASCADE
);
  • 当没有主动为外键约束起名时,MySQL会自动给外键起名,外键名称可以在系统表information_schema.table_constraints中查看

    image.png

  • 外键约束也可以在修改表时添加

    • 语法:ALTER TABLE 子表名 ADD CONSTRAINT fk FOREIGN KEY 子表名(属性名) REFERENCES 主表名(属性名);
  • 外键约束在不被使用时,可以从表中删除

    • 语法:ALTER TABLE 表名 DROP FOREIGN KEY fk;

唯一约束(UNIQUE KEY)

  • 确保不是主键的属性不会出现重复数据

  • 唯一约束与主键约束的区别:

    • 一个表只能定义一个主键约束,但是可以定义多个唯一约束
    • 主键约束不允许属性值为空,而唯一性约束的属性允许为空
    • 定义唯一约束时,同样会在属性列上自动创建索引,加快查询速度
  • 唯一约束可以在定义表时设置(关键字KEY可省略),分为列级约束和表级约束

    • 列级约束:
    CREATE TABLE test_table
    (
      id INT PRIMARY KEY,
      name VARCHAR(20) UNIQUE KEY
    );
    
    • 表级约束(如果唯一约束由多个属性组成,则必须定义为表级约束):
    CREATE TABLE test_table
    (
      id INT PRIMARY KEY,
      name VARCHAR(20),
      UNIQUE KEY(id,name)
    );
    
  • 定义表级约束时,可以给约束起名(删除约束时通过名称删除):

CREATE TABLE test_table
(
    id INT PRIMARY KEY,
    name VARCHAR(20),
    CONSTRAINT u1 UNIQUE KEY(id,name)
);
  • 唯一约束也可以在修改表时添加

    • 语法:ALTER TABLE 表名 ADD CONSTRAINT u1 UNIQUE(属性名);
  • 唯一约束在不被使用时,可以从表中删除(作为索引被删除)

    • 语法:DROP INDEX u1 ON 表名;

非空约束(NOT NULL)、空值约束(NULL)

  • 确保属性列中的数据不能为空,如果没有明确指定非空约束,则默认允许为空

  • 需要注意的是:空值和0或者长度为0的字符串含义不同

  • 非空约束可以在定义表时设置,但只能定义为列级约束

CREATE TABLE test_table
(
    id INT PRIMARY KEY,
    name VARCHAR(20) NOT NULL
);
  • 非空约束也可以在修改表时添加

    • 语法:ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) NOT NULL;
  • 非空约束在不被使用时,可以从表中删除

    • 语法:ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) NULL;

默认值约束(DEFAULT)

  • 即向表中插入数据时,如果用户没有明确给出属性的值,数据库会自动为该属性添加默认值

  • 需要注意的是:如果同一个属性有默认值约束和其他约束,默认值要写在其他约束前面

  • 默认值约束可以在定义表时设置,但只能定义为列级约束

CREATE TABLE test_table
(
    id INT PRIMARY KEY,
        name VARCHAR(20) DEFAULT "zhangsan" NOT NULL
);
  • 默认值约束也可以在修改表时添加

    • 语法:ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) DEFAULT 默认值;
  • 默认值约束在不被使用时,可以从表中删除

    • 语法:ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) DEFAULT NULL;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据库中的五种约束及其添加方法 五大约束 1.—-主键约束(Primay Key Coustraint) 唯一性,...
    向日葵666666阅读 3,184评论 0 1
  • 文章大纲 一、数据库简介二、Mysql数据库简介三、Mysql安装与服务启动(Windows版本)四、Mysql图...
    故事爱人c阅读 8,195评论 0 1
  • 1.数据库操作 查看当前数据库SELECT DATABASE(); 显示用户名,数据库版本SELECT user...
    瘦不下去了阅读 4,415评论 0 2
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 127,055评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,284评论 0 4