主键和外键举例_快速理解MySQL中主键与外键的实例教程

主键与外键的关系,通俗点儿讲,我现在有一个论坛,有两张表,一张是主贴 thread,一张是回帖 reply

先说说主键,主键是表里面唯一识别记录的字段,一般是帖子id,体现在访问的时候,例如是

thread.php?id=1   表示我要访问的是帖子id是1 的帖子~

再来说说外键,当我们删除某个帖子的时候,需要执行另一个操作,就是删除所有回帖,如果正常情况下,我们需要执行两次delete操作(thread和 reply),这时候如果存在外键,例如,在reply 表里面建立一个指向thread表的主键(id)的外键(这个外键绑的字段,必须是对应帖子的id),并指定响应 delete ,那你在删除 thread 的时候,mysql 自己会帮你把 reply 表中这个帖子的回复都删掉,而不需要你手动再去执行一次reply表的delete操作~

至于两者之间的关系,在刚才的例子中,reply 表的外键,指向的就是 thread 表的主键~~

搞个例子,简单演示一下使用,做dage和xiaodi两个表,大哥表是主键,小弟表是外键:

建表:

?1234567891011121314CREATE TABLE `dage` (`id`int(11)NOT NULL auto_increment,`name`varchar(32)default '',PRIMARY KEY (`id`)) ENGINE=InnoDBDEFAULT CHARSET=latin1; CREATE TABLE `xiaodi` (`id`int(11)NOT NULL auto_increment,`dage_id`int(11)default NULL,`name`varchar(32)default '',PRIMARY KEY (`id`),KEY `dage_id` (`dage_id`),CONSTRAINT `xiaodi_ibfk_1`FOREIGN KEY (`dage_id`)REFERENCES `dage` (`id`)) ENGINE=InnoDBDEFAULT CHARSET=latin1;

插入个大哥:

?1mysql>insert into dage(name)values('铜锣湾');

?1Query OK, 1 row affected (0.01 sec)

?1mysql>select *from dage;

?123456+----+--------+| id | name  |+----+--------+| 1 | 铜锣湾 |+----+--------+1 row in set (0.00 sec)

插入个小弟:

?1mysql>insert into xiaodi(dage_id,name)values(1,'铜锣湾_小弟A');

?1Query OK, 1 row affected (0.02 sec)

?1mysql>select *from xiaodi;

?12345+----+---------+--------------+| id | dage_id | name     |+----+---------+--------------+| 1 |    1 | 铜锣湾_小弟A |+----+---------+--------------+

把大哥删除:

?1mysql>delete from dagewhere id=1;

?1ERROR 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`))

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

插入一个新的小弟:

?1mysql>insert into xiaodi(dage_id,name)values(2,'旺角_小弟A');

?12ERROR 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`))

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

把外键约束增加事件触发限制:

?12mysql> showcreate table xiaodi;

CONSTRAINT `xiaodi_ibfk_1`FOREIGN KEY (`dage_id`)REFERENCES `dage` (`id`)

mysql>alter table xiaodidrop foreign key xiaodi_ibfk_1;

?12Query OK, 1 row affected (0.04 sec)Records: 1 Duplicates: 0 Warnings:

?1mysql>alter table xiaodiadd foreign key(dage_id)references dage(id)on delete cascade on update cascade;

?12Query OK, 1 row affected (0.04 sec)Records: 1 Duplicates: 0 Warnings: 0

再次试着把大哥删了:

?1mysql>delete from dagewhere id=1;

?1Query OK, 1 row affected (0.01 sec)

?1mysql>select *from dage;

?1Empty set (0.01 sec)

?1mysql>select *from xiaodi;

?1Empty set (0.00 sec)

得,这回对应的小弟也没了,没办法,谁让你跟我on delete cascade了呢!

例子说明的应该蛮清楚了吧,其他功能对应手册自己实践吧!:-)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 MySQL 的 ER 图外键通常表示为一个连接两个表的箭头。箭头起始点在包含外键的表,指向外键所引用的目标表。箭头上通常会标明外键的名称和关联的字段。 例如,假设有两个表,一个是订单表,另一个是客户表。订单表包含一个名为 customer_id 的列,用于关联客户表的记录。在 ER 图,会在订单表添加一个箭头,指向客户表,并标明外键名称为 customer_id。 另外,有时候也会使用虚线来表示外键,以区别于普通列。具体的 ER 图表示方式可能会因工具和使用习惯而有所不同。 ### 回答2: 在MySQL外键是用来建立两个表之间的关联关系的。外键指向另一个表主要是通过在关联表的定义使用FOREIGN KEY关键字来实现的。 在使用MySQL的ERR图来表示外键指向另一个表时,一般会使用两个表之间的箭头指向另一个表。箭头通常是从外键所在的表指向被引用的表,表示外键建立的关联关系。 例如,假设有一个表A和表B,其表A有一个外键列指向表B主键列。在ERR图,会用一条线段表示表A,另一条线段表示表B,然后在表A的箭头部分画上一个箭头指向表B,表示外键的指向。 总之,在使用MySQL的ERR图来表示外键指向另一个表时,需要使用箭头表示两个表之间的关系,箭头的方向表示外键的指向。这样可以很直观地显示表与表之间的关联关系,方便理解和分析数据模型。 ### 回答3: 在MySQL的ERR图外键通常是通过箭头来表示的。箭头的起点指向当前表的列名,而箭头的终点指向另一个表的主键列名。通常情况下,箭头上方会有一个"F"字母,表示此箭头代表的是外键关系。 举例来说,假设有两个表,一个是"学生" (Students)表,另一个是"课程" (Courses)表。假设在"学生"表有一个名为"课程ID" (Course_ID)的列,用来存储学生所选的课程。假设"课程"表有一个名为"课程编号" (Course_ID)的列,用来唯一标识每个课程。如果我们想要在"学生"表创建一个外键,指向"课程"表的主键"课程编号"列,ERR图的表示为: 学生表 (Students) -> 课程表 (Courses) | | v v 课程ID (Foreign Key) 课程编号 (Primary Key) 在此ERR图,箭头起点为"学生"表的"课程ID"列,箭头终点为"课程"表的"课程编号"列。箭头上方的"F"表示这是一个外键关系。 总结而言,在MySQL的ERR图外键关系通常用箭头表示,箭头起点指向当前表的列名,箭头终点指向另一个表的主键列名,并且箭头上方的"F"表示这是一个外键关系。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值