阻止用户或错误的代码插入无效数据对我来说似乎是理性的,但我不记得在任何地方看到这个!
答案 0 :(得分:1)
由于我不希望用户能够在没有有效地址的情况下下订单,因此我只需将单独的FK删除到用户表,并使用地址表中的组合用户ID - 地址id字段作为外键。
CREATE TABLE orders AS (
--[COLUMN DEFINITIONS]
address_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
CONSTRAINT fk_usr_addr FOREIGN KEY (user_id, address_id)
REFERENCES address(user_id, id)
) ENGINE=InnoDB;
如果订单不完整且还没有地址,那么这应该不是多列外键的问题,因为根据using foreign keys上的mysql文档:
SQL标准中的MATCH子句控制a中NULL值的方式 比较时处理复合(多列)外键 主键。 MySQL本质上实现了定义的语义 MATCH SIMPLE,允许外键全部或部分为NULL。 在这种情况下,包含这样的外键的(子表)行是 允许插入,并且与引用的任何行都不匹配 (父)表。可以使用实现其他语义 触发器。