我有一个approval标记,希望在父表中更改时将其填充下来,但是我不知道如何从子表中引用父表来下拉该值。
作为参考,我希望在将approval中的批准从reservedTickets更新到0时,将reservations中的值1填充为reservations。然而,据我所知,我不能使用标准的FOREIGN KEYREFERENCE引用reservations,因为approval不是唯一的。
在任何人谈到“为什么不在一个表中使用值”之前,首先要区分能够更新reservations表的管理员和非管理员更新reservedTickets的管理员之间的关系。另外,由于FOREIGN KEY中的reservedTickets约束的数量很大,因此必须与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,它需要额外的索引,但它可以满足您的需要。
另一方面,您可以使用trigger Onreservation实现所需的功能,或者将其留给应用程序(或者只通过负责携带此标志的存储过程更新表)。

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 , ....
);

关于mysql - MySQL在父表中引用非唯一值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31953084/

10-10 06:51