[英]MySQL reference non-unique value in parent table
我有一个批准标签,并且希望在父表中更改它时将其填充下来,但是我无法弄清楚如何从子级引用父级以拉低该值。
仅供参考我想要的值approval
的保留填充到reservedTickets
当我更新从审批0
到1
的reservations
。 但是,据我了解,由于approval
不是唯一的,所以我无法使用标准的FOREIGN KEY
或REFERENCE
引用reservations
。
在任何人说“为什么只在一个表中都没有值”之前,是先将能够更新reservations
表的管理员与非管理员更新reservedTickets
关注点分开。 另外,由于reservedTickets
中的FOREIGN KEY
约束数量众多,取决于我的出发点,必须与reservations
表联接以跟踪批准可能很棘手。
CREATE TABLE reservations(
rid int NOT NULL AUTO_INCREMENT,
aid int NOT NULL,
approval tinyint(1) NOT NULL,
creationTime TIMESTAMP
DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (rid),
FOREIGN KEY (aid) REFERENCES accounts (aid)
ON DELETE CASCADE
);
CREATE TABLE reservedTickets(
rid int NOT NULL,
tid int NOT NULL,
hid int NOT NULL,
approval tinyint(1) NOT NULL,
PRIMARY KEY (tid),
FOREIGN KEY (rid) REFERENCES reservations (rid)
ON DELETE CASCADE,
FOREIGN KEY (tid) REFERENCES tickets (tid)
ON DELETE CASCADE,
FOREIGN KEY (hid) REFERENCES people (hid)
ON DELETE CASCADE,
FOREIGN KEY (approval) REFERENCES reservations (approval)
ON UPDATE CASCADE
);
就个人而言,我会避免级联更新,因为许多锁会在后台隐藏引擎问题,但是如果您确实想要它,则可以对reservations(rid,approval)
和引用它的reservedTickets
中的外键有唯一的约束。 就我所记得的Mysql而言,它带有额外索引的开销,但是它可以为您提供所需的内容。
另一方面,您可以通过在reservation
时触发触发器来实现所需的功能,或者将其留给应用程序使用(或仅通过照顾该标志的存储过程来更新表)。
CREATE TABLE reservations(
rid int NOT NULL AUTO_INCREMENT,
aid int NOT NULL,
approval tinyint(1) NOT NULL,
creationTime TIMESTAMP
DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (rid),
CONSTRAINT UQ_RESERVATION_COMPOSITE UNIQUE(rid, approval),
...
);
CREATE TABLE reservedTickets(
rid int NOT NULL,
tid int NOT NULL,
hid int NOT NULL,
approval tinyint(1) NOT NULL,
PRIMARY KEY (tid),
FOREIGN KEY (rid,approval) REFERENCES reservations (rid,approval)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (tid) REFERENCES tickets (tid)
ON DELETE CASCADE,
FOREIGN KEY (hid) REFERENCES people (hid)
ON DELETE CASCADE , ....
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.