繁体   English   中英

MySQL在父表中引用非唯一值

[英]MySQL reference non-unique value in parent table

我有一个批准标签,并且希望在父表中更改它时将其填充下来,但是我无法弄清楚如何从子级引用父级以拉低该值。

仅供参考我想要的值approval的保留填充到reservedTickets当我更新从审批01reservations 但是,据我了解,由于approval不是唯一的,所以我无法使用标准的FOREIGN KEYREFERENCE引用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 , ....
);

您可以在InnoDB中使用foreign key ,这不是很多,因为您不能在非唯一列上使用foreign key 但是,由此引起的问题是,如果您foreign key进行了自动更新或删除,因为数据库将更新所有相同的键。

您可能能够做的是使用一条准备好的语句 ,当您从保留表等中更新时,该语句使您可以更新批准列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM