外键复杂的mysql约束

时间:2016-03-30 09:01:05

标签: mysql database-design constraints

阻止用户或错误的代码插入无效数据对我来说似乎是理性的,但我不记得在任何地方看到这个!

考虑以下表格 enter image description here

  • 如何确保订单始终引用由同一用户创建的地址?
  • 通常和推荐这种约束吗?我的意思是,我甚至不得不在设计中关心它吗?

1 个答案:

答案 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。   在这种情况下,包含这样的外键的(子表)行是   允许插入,并且与引用的任何行都不匹配   (父)表。可以使用实现其他语义   触发器。

相关问题