作者MrMarcus (请勿忘记密码)
看板Database
标题Re: [SQL ] 恭贺开板顺便发问
时间Thu Jun 22 15:53:32 2006
※ 引述《forgmonkey (悲情城市之悲情程式猿)》之铭言:
: 正遇到问题呢...
: 想说ptt有DB板 没想到居然刚开板ㄟ... 酷毙了!!
: 恭贺会研究用哪种键盘打java快的PSMonkey成为版主
: 同是monkey推!!!
: 好啦.. 以下是问题:
: mysql下 primary key可以设定auto increase
: 他实作方式是会纪录一个数字
: 每次Insert一笔资料就会拿这个数字当primary key 并且递增之
: 但是我遇到一个问题... 今天我新增10个资料
: 就有主键1~10的这几笔资料
: 然後删掉4 ,6, 剩下8笔
: 然後再新增一笔 我希望他会成为主键4而不是11
: 能够在SQL的语法那边就解决掉嘛?
: 还是必须每次插入都要用程式检查最小的空栏是哪一个?
: 不过我想这种方式因该load太大吧?
: //以下有点题外话
: 会有这个困难 起因是比方这个资料表叫A 有另外一个资料表B靠A的主键与之关联
: 如果A4被删掉 那所有B中和a4关联的全部变成无主孤魂啊
: 我想到的另一种方式是... 乾脆删掉a4时,顺便杀掉b中和a4关联的东西...
看来似乎很多人都不晓得mysql有foreign key constrain喔?
在建立资料表的时候只要选用Innodb作为资料表格式(很多状况下新建立
的资料表格式是myisam,这种格式就没有foreign key constrain了),
不但有transaction功能也有foreign key constrain,而且这从mysql 3.2x
的时代就有了(至少两三年以上),不是最近的事情。
你所说的B资料表的记录参照到A资料表,当A资料表某笔记录被删掉,造成
B资料表中参照到该被删资料的记录都变成无主孤魂的问题,就是要靠
foreign key constrain来处理(当然你也可以在应用程式的层级自己写
程式码处理这个问题,但是在资料库层级做好各资料表之间的关连与限制
是好的,而且省事多了)。设定正确的话,你可以有以下选择
1. 当A4被删掉,B资料表中参照到A4的资料也会被自动删除(on delete cascade)
如果有C资料表参照到B,C中参照到B的资料也会被连动自动删除。
2. 当A4被删掉,B资料表中参照到A4的资料关连的栏位值会被自动设为null
(on delete set null)
3. 当B资料表中有参照到A4的资料时,则不允许删除A4这笔记录(on delete restrict)
硬要删除A4会有错误讯息。
这些功能可以让你确保各资料表之间的完整关连性,不会有孤儿资料存在。
而且不用自己写一堆程式码来维持这些关连,实在是必备良药。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.154.199.81
1F:推 drkkimo:mysql的foreign key好像是 5.0以後才有的~ 06/24 14:09