MySQL从入门到放弃第三章:约束

约束


学习目录
- 约束保证数据的完整行和一致性
- 约束按数据列的数目划分:
- 表级约束
- 列级约束
- 约束按功能划分:
- NOT NULL 非空约束
- PRIMARY KEY 主键约束
- UNIQUE KEY 唯一约束
- DEFAULT 默认约束
- FOREIGN KEY 外键约束

外键约束FOREIGN KEY
  • 外键约束 保证数据一致性,完整性,实现一对一,一对多的关系
  • 外键约束的要求:
    1. 父表和子表必须使用相同的存储引擎,而且尽职使用临时表
      • 具有外键列的表为子表,子表所参照的表为父表
      • 编辑数据表的默认存储引擎 MySQL配置文件 default-storage-engine=INNODB
    2. 数据表的存储引擎只能为InnoDB
    3. 外键列和参照列必须具有相似的数据类型,其中数字的长度或是否有符号必须相同;而字符的长度则可以不同
      • 具有FOREIGN KEY 的那一列为外键列,它所参照的那一列为参照列
    4. 外键列和参照列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引
      • 参照列没有索引,MySQL才会自动创建,外键列没有的话不会

省份表

CREATE TABLE PROVINCES(
`id` SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL)

users表

CREATE TABLE USERS(
`id` SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
pid SNALLINT UNSIGNED,
FOREIGN KEY(pid) REFERENCES privinces (id) )


  • 关系型数据库,用户表中想存储省份,不用存省份,用省份id, 这里的id就是外键
  • 有外键的表users成为子表,参照的表provinces为父表
  • 外键pid参照 privinces表中的id,两者必须具有相似的数据类型,其中数字的长度或是否有符号必须相同;而字符的长度则可以不同

外键约束的参照操作
  • 表关联之后,父表更新,子表是否更新的操作
  • 实际开发中不去定义物理的外键,而是逻辑的外键(使用某种结构而不是FOREIGN KEY这个关键字)
    1. CASCADE: 从父表删除或更新且自动删除,或个鞥新子表中匹配的行
    2. SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
    3. RESTRICT: 拒绝对父表的删除或更新操作
    4. NO ACTION: 标准SQL的关键字,在MySQL中与RESTRICT相同


      > CREATE TABLE USER2(
      > id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
      > username VARCHAR(20) NOT NULL,
      >pid SNALLINT UNSIGNED,
      >FOREIGN KEY(pid) REFERENCES privinces (id) ON DELETE CASCADE)
      >

  • MySQL表级约束和列级约束
    • 对一个数据列建立的约束为列级约束,多个则为表级约束
    • 列级约束既可以在列定义时声明,也可以在列定义后声明
    • 表级约束只能在列定义后声明

    你可能感兴趣的:(MySQL)