约束的意义
1.约束保证数据的完整性和一致性
2.约束分为表级约束和列级约束
3.约束类型包括
- NOT NULL (非空约束)
- PRIMARY KEY (主键约束)
- UNIQUE KEY (唯-约束)
- DEFAULT (默认约束)
- FOREIGN KEY (外键约束)
4.外键约束FOREIGN KEY
保持数据一致性,完整性。
实现一对一或一堆多关系,简单来说举个例子,现在有个管理学生的数据库,其中有很多数据表,比如学生信息表,学生期中考试成绩表,学生期末考试成绩表等等,这其中有一个数据字段是完全一致的且不会重复,就是学号,此时可以在其他成绩表中与信息表中的学号字段建立外键约束。
外键约束的规则
1.父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
2.数据表的存储引擎只能为InnoDB(创建表一般默认为innoDB)。
3.外键列和参 照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同;
而字符的长度则可以不同。
4.外键列和参 照列必须创建索引。如果外键列不存在索引的话,MySQL将 自动创建索引。
5.查看索引: SHOW INDEXES FROM 数据表名
CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
格式: ON {UPDATE | DELETE CASCADE}
SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项
必须保证子表列没有指定NOT NULL。
RESTRICT:拒绝对附表的删除或更新操作
NO ACTION:标准SQL的关键字,在MySQL中 与RESTRICT相同
首先创建一个学生信息表(父表):
mysql> CREATE TABLE 学生信息表(
-> 学号 INT AUTO_INCREMENT PRIMARY KEY,
-> 姓名 VARCHAR(10),
-> 性别 ENUM('男','女'),
-> 年龄 INT UNSIGNED)
再创建一个学生其中考试成绩表(子表),并添加删除级联:
mysql> CREATE TABLE 学生期中考试成绩表(
-> 考试学号 INT,
-> 成绩 INT UNSIGNED,
-> FOREIGN KEY(考试学号) REFERENCES 学生信息表(学号) ON DELETE CASCADE);
不过一般性外键约束属于物理性约束,用的比较少性能比较差