我正在重新设计一些应用程序安全日志表(例如用户登录时、访问不同文件等),以解决一些不断变化的需求。它们最初是用 制作的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 中保留该行,但将数据清空。关闭但没有雪茄。
- SET DEFAULT : MySQL 识别它,但拒绝它。
- 省略 ON DELETE:相当于 RESTRICT。
我以前从未使用过这样的外键(强制但不是),INSERT
并且在阅读了很多其他问题之后,似乎其他人也没有这样做。那可能应该告诉我这是错误的方法,但是它可以以某种方式起作用吗?UPDATE
DELETE