超键,候选键,主键,外键;drop,truncate和delete的区别;外键约束

超键,候选键,主键,外键

  • 主键:对数据库表中的每一行数据进行唯一标识

    • 任意两行的主键值都不同
    • 包含主键值的列从不修改或更新
    • 主键值不能重用
    • 使用PRIMARY KEY进行标识
  • 外键:如果关系模式R1中的某属性集不是R1的主键,而是另一个关系R2的主键,则该属性集是关系模式R1的外键;

  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。比如一张学生信息表,学生表中含有学号或者身份证号的任意组合都称为此表的超键。如:(学号),(学号,姓名),(身份证号,性别)等;

  • 候选键:不含多余属性的超键称为候选键;

drop,truncate和delete的区别

  • 执行速度drop > truncate > delete
  • delete是一行一行删除,truncate删除表全部数据,drop将表数据和表结构一起删除
  • deleteDML语句(Data Manipulation Language)没提交事务还可以回滚,truncatedropDDL语句(Data Definition Language),操作完马上生效,不能回滚
  • FOREIGN KEY约束引用的表,不能使用TRUNCATE TABLE,而应该使用不带WHERE子句的DELETE语句

外键约束

InnoDB是目前MySQL中唯一支持外键的内置存储引擎

使用外键是有成本的,比如外键通常都要求每次在修改数据时都要在另外一张表中多执行一次查找操作。虽然InnoDB强制外键使用索引,但还是无法消除这种约束检查的开销。如果外键列的选择性很低,则会导致一个非常大且选择性很低的索引。例如,在一个非常大的表上有status列,并希望限制这个状态列的取值,如果该列只能取三个值——虽然这个列本身很小,但是如果主键很大,那么这个索引就会很大——而且这个索引除了做这个外键限制,也没有任何其他的作用。

不过,在某些场景下,外键会提升一些性能。如果想确保两个相关表是有一致的数据,那么使用外键比在应用程序中检查一致性的性能要高得多,此外,外键在相关数据的删除和更新上,也比在应用中维护更高效,不过,外键维护操作是逐行进行的,所以这样的更新会比批量删除和更新要慢些

外键约束使得查询需要额外访问一些别的表,这也意味着需要额外的锁。如果向子表中写入一条记录,外键约束会让InnoDB检查对应的父表的记录,也就需要对父表对应记录进行加锁操作,来确保这条记录不会再这个事务完成之时就被删除。这会导致额外的锁等待,甚至会导致一些死锁。因为没有直接访问这些表,所以这类死锁问题往往难以排查

如果只是使用外键做约束,那通常在应用程序里实现该约束会更好。外键会带来很大的额外消耗。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值