いくつかのアプリケーション セキュリティ ログ テーブル (ユーザーがログインしたとき、別のファイルにアクセスしたときなど) を再設計して、いくつかの変化する要件に対応しようとしています。それらはもともと で作成されてMyISAM
いましたが、それほど頻繁にアクセスされることはなくInnoDB
、データの整合性のために一連の外部キーに切り替えて追加することは、実際にはより有益です。いずれにせよテーブルを作り直さなければならないので、これまでになく切り替えを行う良い機会だと思います.
ほとんどの場合、すべてが単純な外部キーであり、期待どおりに機能します。私が何か奇妙なことを試みて問題を抱えている唯一の部分は、user_idsです。これらのログ テーブルの各レコードは user_id に関連付けられており、レコードが挿入されたときに指定された user_id が存在することを確認したいと考えています。ユーザーテーブルを参照する外部キーを追加すると、その問題が解決されます-簡単なことです。以下に、簡潔で代表的な表をいくつか示します。
ユーザーテーブル
CREATE TABLE tbl_user (
id INT(10) NOT NULL AUTO_INCREMENT,
first_name VARCHAR(50),
PRIMARY KEY(id)
) ENGINE=InnoDB;
ログテーブルの例
CREATE TABLE tbl_login_time (
id INT(10) NOT NULL AUTO_INCREMENT,
user_id INT(10) NOT NULL,
login_at TIMESTAMP NOT NULL,
PRIMARY KEY(id),
CONSTRAINT 'tbl_login_time_fk_1` FOREIGN KEY (user_id) REFERENCES tbl_user
ON UPDATE CASCADE ON DELETE ???
) ENGINE=InnoDB;
私の問題は、挿入、更新をカスケードするために外部キーを適用したいが、tbl_user のレコードを削除しても tbl_login_time にまったく影響を与えないようにすることです。通常、ユーザーは非アクティブとしてマークされますが、たまにユーザーが完全に削除されることがありますが、ログを維持する必要があります。
MySQL ドキュメントにはの6 つのオプションがリストされていますがON DELETE
、どれも適切ではありません。
- RESTRICT : tbl_user での削除を防止します。
- NO ACTION : RESTRICT と同様に評価されます。
- CASCADE:私が望むようにtbl_userで削除しますが、tbl_login_timeでも削除します。
- SET NULL : tbl_user で削除し、tbl_login_time で行を残しますが、データを null にします。閉じますが、葉巻はありません。
- SET DEFAULT : MySQL はそれを認識しますが、拒否します。
- 省略 ON DELETE : RESTRICT と同等。
私はこれまでこのような外部キーを使用したことがありません (強制INSERT
andUPDATE
ではありませんDELETE
)。他の多くの質問を読んだ後、他の誰かも使用しているようには見えません。おそらく、これは間違ったアプローチであることがわかるはずですが、何とか機能しますか?