我继承了一个设计非常糟糕的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 -从而链接到旧用户的首选项(非常不希望)。
尽管实现很差(是的,我知道正确的做法是重构代码并使用真正的外键关系更新数据库),但是否有办法保证主键永远不会被重用?
您可以创建一个约束,将带有相关主键的que记录删除后的外键值设置为空。可以通过以下命令实现:
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
的值。