mysql表定义外键语法_mysql设置外键的语法怎么写?

2012-08-31 回答

mysql外键设置详解

(1) 外键的使用:

外键的作用,主要有两个:

一个是让数据库自己通过外键来保证数据的完整性和一致性

一个就是能够增加er图的可读性

有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦

其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.

例如:

有一个基础数据表,用来记录商品的所有信息。其他表都保存商品id。查询时需要连表来查询商品的名称。单据1的商品表中有商品id字段,单据2的商品表中也有商品id字段。如果不使用外键的话,当单据1,2都使用了商品id=3的商品时,如果删除商品表中id=3的对应记录后,再查看单据1,2的时候就会查不到商品的名称。

当表很少的时候,有人认为可以在程序实现的时候来通过写脚本来保证数据的完整性和一致性。也就是在删除商品的操作的时候去检测单据1,2中是否已经使用了商品id为3的商品。但是当你写完脚本之后系统有增加了一个单据3 ,他也保存商品id找个字段。如果不用外键,你还是会出现查不到商品名称的情况。你总不能每增加一个使用商品id的字段的单据时就回去修改你检测商品是否被使用的脚本吧,同时,引入外键会使速度和性能下降。

(2) 添加外键的格式:

alter table yourtablename

add [constraint 外键名] foreign key [id] (index_col_name, ...)

references tbl_name (index_col_name, ...)

[on delete {cascade | set null | no action | restrict}]

[on update {cascade | set null | no action | restrict}]

说明:

on delete/on update,用于定义delete,update操作.以下是update,delete操作的各种约束类型:

cascade:

外键表中外键字段值会被更新,或所在的列会被删除.

restrict:

restrict也相当于no action,即不进行任何操作.即,拒绝父表update外键关联列,delete记录.

set null:

被父面的外键关联字段被update ,delete时,子表的外键列被设置为null.

而对于insert,子表的外键列输入的值,只能是父表外键关联列已有的值.否则出错.

外键定义服从下列情况:(前提条件)

1)

所有tables必须是innodb型,它们不能是临时表.因为在mysql中只有innodb类型的表才支持外键.

2)

所有要建立外键的字段必须建立索引.

3)

对于非innodb表,foreign key子句会被忽略掉。

注意:

创建外键时,定义外键名时,不能加引号.

如: constraint 'fk_1' 或 constraint "fk_1"是错误的

(3) 查看外键:

show create table ***;可以查看到新建的表的代码以及其存储引擎.也就可以看到外键的设置.

删除外键:

alter table drop foreign key '外键名'.

注意:

只有在定义外键时,用constraint 外键名 foreign key .... 方便进行外键的删除.

若不定义,则可以:

先输入:alter table drop foreign key -->会提示出错.此时出错信息中,会显示foreign key的系统默认外键名.--->

用它去删除外键.

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

weixin_39738667

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值