gpt4 book ai didi

MySQL:添加字段值不变的外键

转载 作者:行者123 更新时间:2023-11-30 22:43:29 25 4
gpt4 key购买 nike

我有如下两个表,

CustAddr {custid, addrtype, address}& OrderDetails {orderid, custid,.....,delivery-address}

我想在 OrderDetails 上添加 FK,以便 (custid, delivery-address) 始终引用 CustAddr 表中的 (custid, 'CURRENT', address)。这个想法是,如果地址不是最新的,我不能将送货地址添加到订单详细信息。

我的问题,1. 是否可以在 MysQL INNODb 中执行此操作?2. 如果不能,有哪些替代方案?

谢谢...

PS:我以上表为例,我的表完全不同。但是这个类比很容易理解。谢谢!

最佳答案

你不能让外键约束强制执行。

但是您可以使用 BEFORE INSERTBEFORE UPDATE 触发器强制将 CURRENT 分配给给定的列,在这种情况下,您的order_detail 表中的外键列 addrtype

DELIMITER $$

CREATE TRIGGER order_detail_bi
BEFORE INSERT ON order_detail
FOR EACH ROW
BEGIN
NEW.addrtype = 'CURRENT';
END$$

DELIMITER ;

您还需要相应的 BEFORE UPDATE 触发器。其余的由外键定义处理:

ALTER TABLE order_detail ADD CONSTRAINT FK_order_detail_custaddr 
FOREIGN KEY (custid,addrtype)
REFERENCES custaddr (custid, addrtype)

编辑

可以定义外键约束

  ON UPDATE CASCADE

order_detail 上的 BEFORE UPDATE 触发器不会针对受“级联”更新操作影响的行触发。 (这是 MySQL 的一个奇怪的怪癖。这确实使编写记录由“级联”操作引起的更新和删除的“审计”触发器变得更加复杂。)

BEFORE UPDATE 触发器可以防止对 attrtype 列的值进行更改,例如:

CREATE TRIGGER order_detail_bi
BEFORE INSERT ON order_detail
FOR EACH ROW
BEGIN
NEW.addrtype = OLD.addrtype;
END$$

这样获得不同值的唯一方法是通过“级联”更新,或者在执行更新之前禁用触发器,然后重新启用触发器。

关于MySQL:添加字段值不变的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com