MySQL引用父表中的非唯一值

MySQL引用父表中的非唯一值,mysql,Mysql,我有一个approval标记,希望在父表中更改它时将其向下填充,但是我不知道如何从子表中引用父表以向下拉值 作为参考,我希望当我将0中的批准更新为reservations中的1时,将保留中的approval值填充到reservedTickets。但是,据我所知,我不能使用标准的外键或引用引用保留,因为批准不是唯一的 在任何人谈论“为什么不在一个表中只包含该值”之前,首先要将能够更新保留表的管理员和非管理员更新保留tickets的管理员之间的问题分开。此外,由于reservedTickets中存在

我有一个approval标记,希望在父表中更改它时将其向下填充,但是我不知道如何从子表中引用父表以向下拉值

作为参考,我希望当我将
0
中的批准更新为
reservations
中的
1
时,将保留中的
approval
值填充到
reservedTickets
。但是,据我所知,我不能使用标准的
外键
引用
引用
保留
,因为
批准
不是唯一的

在任何人谈论“为什么不在一个表中只包含该值”之前,首先要将能够更新
保留
表的管理员和非管理员更新
保留tickets
的管理员之间的问题分开。此外,由于
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
);

就我个人而言,我会避免级联更新,因为在幕后会出现许多锁定引擎的问题,但是如果你真的需要,你可以对
保留(rid,approval)
和引用它的
reservedTickets
中的外键设置一个唯一的约束。就我记忆中的Mysql而言,它需要额外的索引,但它可以满足您的需求。
另一方面,您可以使用保留上的触发器来实现所需的功能,或者将其留给应用程序(或者仅通过负责携带此标志的存储过程来更新表)


并不是说不能在非唯一列上使用
外键,因为可以在InnoDB中使用。但是,如果您对
外键
进行了自动更新或删除,则会出现这样的问题,因为数据库会更新所有相同的键


您可以做的是,使用一个允许您在从保留表等更新时更新批准列的选项。

通过唯一约束,您的意思是将保留中的主键设置为(rid,批准),然后在更新时层叠吗?
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 , ....
);