请选择 进入手机版 | 继续访问电脑版

[MySql] 简述MySQL主键和外键使用 及阐明

[复制链接]
查看186 | 回复41 | 2021-9-12 22:30:44 | 显示全部楼层 |阅读模式
目次

一、外键束缚

      MySQL通过外键束缚 来保证表与表之间的数据的完备 性和正确 性。

什么是外键:

主键:是唯一标识一条记录,不能有重复的,不答应 为空,用来保证数据完备 性

外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立接洽 用的。以是 说,假如 谈到了外键,肯定 是至少涉及到两张表。比方 下面这两张表:

 外键的利用 条件:

    1.两个表必须是InnoDB表,MyISAM表临时 不支持外键(听说 以后的版本有大概 支持,但至少如今 不支持);
   2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会主动 创建索引,但假如 在较早的版本则必要 表现 建立;
   3.外键关系的两个表的列必须是数据范例 相似,也就是可以相互转换范例 的列,比如int和tinyint可以,而int和char则不可以;

外键的好处:可以使得两张表关联,保证数据的划一 性和实现一些级联操作;

外键的定义语法:

  1. [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
  2.     REFERENCES tbl_name (index_col_name, ...)
  3.     [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
  4.     [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
复制代码

该语法可以在 CREATE TABLE 和 ALTER TABLE 时利用 ,假如 不指定CONSTRAINT symbol,MYSQL会主动 天生 一个名字。
ON DELETE、ON UPDATE表示变乱 触发限定 ,可设参数:

  • RESTRICT(限定 外表中的外键改动)
  • CASCADE(跟随外键改动)
  • SET NULL(设空值)
  • SET DEFAULT(设默认值)
  • NO ACTION(无动作,默认的)

简单演示利用

做dage和xiaodi两个表,大哥表是主键,小弟表是外键

建表:

  1. CREATE TABLE `dage` (
  2. `id` int(11) NOT NULL auto_increment,
  3. `name` varchar(32) default '',
  4. PRIMARY KEY (`id`))
  5. ENGINE=InnoDB DEFAULT CHARSET=latin1;
  6. CREATE TABLE `xiaodi` (
  7. `id` int(11) NOT NULL auto_increment,
  8. `dage_id` int(11) default NULL,
  9. `name` varchar(32) default '',
  10. PRIMARY KEY (`id`),
  11. KEY `dage_id` (`dage_id`),
  12. CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
复制代码

插入个大哥:

  1. mysql> insert into dage(name) values('铜锣湾');
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> select * from dage;
  4. +----+--------+
  5. | id | name |
  6. +----+--------+
  7. | 1 | 铜锣湾 |
  8. +----+--------+
  9. 1 row in set (0.00 sec)
复制代码

插入个小弟:

  1. mysql> insert into xiaodi(dage_id,name) values(1,'铜锣湾_小弟A');
  2. Query OK, 1 row affected (0.02 sec)
  3. mysql> select * from xiaodi;
  4. +----+---------+--------------+
  5. | id | dage_id | name |
  6. +----+---------+--------------+
  7. | 1 | 1 | 铜锣湾_小弟A |
  8. +----+---------+--------------+
复制代码

把大哥删除:

  1. mysql> delete from dage where id=1;
  2. ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))
复制代码

提示:不行呀,有束缚 的,大哥下面还有小弟,可不能扔下我们不管呀!

插入一个新的小弟:

  1. mysql> insert into xiaodi(dage_id,name) values(2,'旺角_小弟A');
  2. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))
复制代码

提示:小子,想造反呀!你还没大哥呢!

把外键束缚 增长 变乱 触发限定 :

  1. mysql> show create table xiaodi;
  2. CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
  3. mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1;
  4. Query OK, 1 row affected (0.04 sec)
  5. Records: 1 Duplicates: 0 Warnings:
  6. mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
  7. Query OK, 1 row affected (0.04 sec)
  8. Records: 1 Duplicates: 0 Warnings: 0
复制代码

再次试着把大哥删了:

  1. mysql> delete from dage where id=1;
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> select * from dage;
  4. Empty set (0.01 sec)
  5. mysql> select * from xiaodi;
  6. Empty set (0.00 sec)
复制代码

哎呦,这回对应的小弟也没了,没办法,谁让你跟我on delete cascade(级联限定 )了呢!

必要 留意 的点

  • 表名是否对应
  • 表的字段是否对应
  • 外键关联的键是否为另一张表的主键

到此这篇关于简述MySQL主键和外键利用 及阐明 的文章就先容 到这了,更多相干 MySQL主键和外键内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar hecgdge4 | 2021-9-30 18:08:42 | 显示全部楼层
东方不败还是灭绝师太啊?
回复

使用道具 举报

avatar 心素如菊棺 | 2021-10-1 00:54:36 | 显示全部楼层
很给力!
回复

使用道具 举报

avatar 123457262 | 2021-10-1 00:54:38 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar WY20172017 | 2021-10-9 09:08:32 | 显示全部楼层
楼上的忘记吃药了!
回复

使用道具 举报

avatar 贺长云 | 2021-10-10 00:51:17 | 显示全部楼层
求加金币!
回复

使用道具 举报

avatar 我不是黄蓉500 | 2021-10-10 12:52:50 | 显示全部楼层
最近压力山大啊!
回复

使用道具 举报

avatar 123457148 | 2021-10-10 17:22:59 | 显示全部楼层
看帖回帖一条路!
回复

使用道具 举报

avatar 小灰363 | 2021-10-10 17:58:26 | 显示全部楼层
今天的心情很不错啊
回复

使用道具 举报

avatar 深圳林妙可 | 2021-10-11 07:40:45 | 显示全部楼层
今天皮痒了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则