4

我继承了一个设计非常糟糕的 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 - 从而链接到旧用户的偏好(非常不受欢迎)。

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

4

1 回答 1

1

在删除具有相关主键的 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.

于 2013-06-14T02:37:25.060 回答