我继承了一个设计很差的mysql数据库,其中在用户表和首选项表之间没有真正的外键。
考虑
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL COMMENT 'email address',
...
)
和
CREATE TABLE `preference` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
...
)
如果我从用户表中删除一行,则会使首选项表孤立。但是,使用mysql中的上述主键,只要我向用户表添加一个新行,它实际上将使用先前删除的行中的旧ID - 从而链接到旧用户的首选项(非常不受欢迎)。
尽管实现很差(是的,我知道正确的做法是重构代码并使用真正的外键关系更新数据库),有没有办法保证主键永远不会被重用?
答案 0 :(得分:1)
您可以创建一个约束,以便在删除具有相关主键的que记录后将外键的值设置为null。它可以通过以下方式实现:
ALTER TABLE `fk_table`
ADD CONSTRAINT `fk_constraint_name`
FOREIGN KEY(`fk_field`)
REFERENCES `pk-table` (`pk`) ON DELETE SET NULL ON UPDATE SET NULL
正如您在问题的评论中所说,MySQL不会重用auto_increment
中的值。