超键,候选键,主键,外键
-
主键:对数据库表中的每一行数据进行唯一标识
- 任意两行的主键值都不同
- 包含主键值的列从不修改或更新
- 主键值不能重用
- 使用
PRIMARY KEY
进行标识
-
外键:如果关系模式R1中的某属性集不是R1的主键,而是另一个关系R2的主键,则该属性集是关系模式R1的外键;
-
超键:在关系中能唯一标识元组的属性集称为关系模式的超键。比如一张学生信息表,学生表中含有学号或者身份证号的任意组合都称为此表的超键。如:(学号),(学号,姓名),(身份证号,性别)等;
-
候选键:不含多余属性的超键称为候选键;
drop,truncate和delete的区别
- 执行速度
drop > truncate > delete
delete
是一行一行删除,truncate
删除表全部数据,drop
将表数据和表结构一起删除delete
是DML
语句(Data Manipulation Language)没提交事务还可以回滚,truncate
和drop
是DDL
语句(Data Definition Language),操作完马上生效,不能回滚- 有
FOREIGN KEY
约束引用的表,不能使用TRUNCATE TABLE
,而应该使用不带WHERE
子句的DELETE
语句
外键约束
InnoDB是目前MySQL中唯一支持外键的内置存储引擎。
使用外键是有成本的,比如外键通常都要求每次在修改数据时都要在另外一张表中多执行一次查找操作。虽然InnoDB
强制外键使用索引,但还是无法消除这种约束检查的开销。如果外键列的选择性很低,则会导致一个非常大且选择性很低的索引。例如,在一个非常大的表上有status
列,并希望限制这个状态列的取值,如果该列只能取三个值——虽然这个列本身很小,但是如果主键很大,那么这个索引就会很大——而且这个索引除了做这个外键限制,也没有任何其他的作用。
不过,在某些场景下,外键会提升一些性能。如果想确保两个相关表是有一致的数据,那么使用外键比在应用程序中检查一致性的性能要高得多,此外,外键在相关数据的删除和更新上,也比在应用中维护更高效,不过,外键维护操作是逐行进行的,所以这样的更新会比批量删除和更新要慢些。
外键约束使得查询需要额外访问一些别的表,这也意味着需要额外的锁。如果向子表中写入一条记录,外键约束会让InnoDB
检查对应的父表的记录,也就需要对父表对应记录进行加锁操作,来确保这条记录不会再这个事务完成之时就被删除。这会导致额外的锁等待,甚至会导致一些死锁。因为没有直接访问这些表,所以这类死锁问题往往难以排查。
如果只是使用外键做约束,那通常在应用程序里实现该约束会更好。外键会带来很大的额外消耗。