Mysql 如何使用DELETE并保持引用完整性?

Mysql 如何使用DELETE并保持引用完整性?,mysql,sql,Mysql,Sql,我创建了三个表,以便: CREATE TABLE guest( name varchar(100), ranking int, PRIMARY KEY (name) ); CREATE TABLE room( roomname varchar(100), wallcolor varchar(100), rating int, PRIMARY KEY(roomnane) ); CREATE TABLE reservation( name varchar(100), roo

我创建了三个表,以便:

CREATE TABLE guest(

name varchar(100),
ranking int,
PRIMARY KEY (name)
);

CREATE TABLE room(

 roomname varchar(100),
 wallcolor varchar(100),
 rating int,
 PRIMARY KEY(roomnane)
 );

 CREATE TABLE reservation(

 name varchar(100),
 roomname varchar(100),
 day varchar(100),
 moveinday int,
 moveoutday int,
 PRIMARY KEY(roomname, day, start, finish),
  FOREIGN KEY(roomname) REFERENCES room(roomname),
  FOREIGN KEY(name) REFERENCES guest(name)
 );
我正在尝试编写一个删除查询来删除所有没有资格租用房间的客人。符合租赁条件意味着客人排名高于或等于客房排名

我试过了

DELETE FROM guest, reservations
WHERE guest.ranking<  rooms.ranking
从客人、预订中删除
哪里有客人。排名<房间。排名

这似乎违反了从预订到来宾表的引用完整性。如何解决此问题?

tchelidze突出显示了一个案例:

假设来宾1的级别低于room1,但高于room2。如果 如果删除guest1,则引用完整性将在中受到侵犯 预订表(适用于1排2号房间的客人)

我认为您不应该删除来宾条目。因为那个特定的客人可能还有其他有效的预订

[因此,如果您删除该客人,您可能会失去您的潜在客户。巨大的损失!:p]


您不应删除客人,而应删除违反您标准的相应预订条目。

这就是我想做的

我将删除所有客人排名低于客房排名的预订,但不会删除客人本身。

所以这里是查询:

说明:


问题是,假设
guest1
的排名低于
room1
,但高于
room2
。如果您删除
guest1
预订表(对于
room2
guest1
行)中的参考完整性将受到侵犯。切利泽是对的。在这种情况下,您必须决定是否删除该特定客人,尽管他可能有其他有效的预订。您不应该删除该客人,而应该删除违反您标准的相应预订条目。您是否要删除该客人?这是如何工作的?您正在删除整个预订表?不,我没有删除整个预订表<代码>从tableA中删除tableA内部连接tableA上的tableB.value=tableB.value。此特定查询将删除表A中与表B中相应条目匹配的条目。不是整个表A。
DELETE reservation
FROM
    reservation
INNER JOIN (
    SELECT
        reservation.roomname,
        reservation.day,
        reservation.start,
        reservation.finish
    FROM
        guest
    INNER JOIN reservation ON reservation.name = guest.name
    INNER JOIN room ON reservation.roomname = room.roomname
    WHERE
        room.rating > guest.ranking
) invalidReservationTable 
ON reservation.roomname = invalidReservationTable.roomname
AND reservation.day = invalidReservationTable.day
AND reservation.start = invalidReservationTable.start
AND reservation.finish = invalidReservationTable.finish