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

関連する主キーを持つキュー レコードが削除された後、外部キーの値を 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

于 2013-06-14T02:37:25.060 に答える