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两个表,⼤哥表是主键,⼩弟表是外键:
建表:
CREATE TABLE `dage` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(32) default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `xiaodi` (
`id` int(11) NOT NULL auto_increment,
公式sqrt`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=InnoDB DEFAULT CHARSET=latin1;
插⼊个⼤哥:
mysql> insert into dage(name) values('铜锣湾');
Query OK, 1 row affected (0.01 sec)
mysql> select * from dage;
+----+--------+
| id | name |
+----+--------+
| 1 | 铜锣湾 |
+----+--------+
1 row in set (0.00 sec)
插⼊个⼩弟:
mysql> insert into xiaodi(dage_id,name) values(1,'铜锣湾_⼩弟A');
php文字大型游戏源码Query OK, 1 row affected (0.02 sec)
mysql> select * from xiaodi;
+----+---------+--------------+
| id | dage_id | name |
+----+---------+--------------+
| 1 | 1 | 铜锣湾_⼩弟A |
+----+---------+--------------+
把⼤哥删除:
mysql> delete from dage where id=1;
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`))提⽰:不⾏呀,有约束的,⼤哥下⾯还有⼩弟,可不能扔下我们不管呀!
插⼊⼀个新的⼩弟:
mysql面试题 知乎mysql> insert into xiaodi(dage_id,name) values(2,'旺⾓_⼩弟A');
2ERROR 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`))提⽰:⼩⼦,想造反呀!你还没⼤哥呢!
把外键约束增加事件触发限制:
mysql> show create table xiaodi;
CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings:
mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
再次试着把⼤哥删了:
mysql> delete from dage where id=1;
Query OK, 1 row affected (0.01 sec)
mysql> select * from dage;
Empty set (0.01 sec)
mysql> select * from xiaodi;
Empty set (0.00 sec)
得,这回对应的⼩弟也没了,没办法,谁让你跟我on delete cascade了呢!
例⼦说明的应该蛮清楚了吧,其他功能对应⼿册⾃⼰实践吧!:-)
在知乎上看到关于设计数据库时是否使⽤外键的问题:
外键是否采⽤看业务应⽤场景,以及开发成本的,⼤致列下什么时候适合,什么时候不适合使⽤:
1. 互联⽹⾏业应⽤不推荐使⽤外键:⽤户量⼤,并发度⾼,为此数据库服务器很容易成为性能瓶颈,尤其受IO能⼒限制,且不能轻易地⽔平扩展;若是把数据⼀致性的控制放到事务中,也即让应⽤服务器承担此部分的压⼒,⽽引⽤服务器⼀般都是可以做到轻松地⽔平的伸缩;
2.传统⾏业tablet的名词
1>.软件应⽤的⼈数有限,换句话说是可控的;
2>.数据库服务器的数据量也⼀般不会超⼤,且活跃数据有限;
综合上述2句话描述,也即数据库服务器的性能不是问题,所以不⽤过多考虑性能的问题;另外,使⽤外键可以降低开发成本,借助数据库产品⾃⾝的触发器可以实现表与关联表之间的数据⼀致性和更新;
最后⼀点,使⽤外键的⽅式,还可以做到开发⼈员和数据库设计⼈员的分⼯,可以为程序员承担更多的⼯作量;
学生信息管理系统代码html为何说外键有性能问题:
imgurl属性1.数据库需要维护外键的内部管理;
2.外键等于把数据的⼀致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做⼀些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,⽽不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁⽽容易出现死锁情况;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论