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