我怎么能拥有一个mysql主键,即使它被删除后也不会重复

时间:2013-06-14 02:33:37

标签: mysql primary-key auto-increment

我继承了一个设计很差的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 - 从而链接到旧用户的首选项(非常不受欢迎)。

尽管实现很差(是的,我知道正确的做法是重构代码并使用真正的外键关系更新数据库),有没有办法保证主键永远不会被重用?

1 个答案:

答案 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中的值。