mysql - 如何使用 DELETE 并保持参照完整性?

标签 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),
 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 查询来删除所有不符合租房条件的客人。合租即客人等级大于等于房间等级。

我试过了

DELETE FROM guest, reservations
WHERE guest.ranking<  rooms.ranking

这似乎违反了从预订到客人表的参照完整性。我该如何解决这个问题?

最佳答案

tchelidze 强调了一个案例:

Let's say guest 1 has lower rank than room1 but higher than room2. If you delete guest1 then referential integrity will be violated in reservation table (for room2 guest1 row).

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

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

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

这就是我想要做的。

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

下面是查询:

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

解释:

enter image description here

关于mysql - 如何使用 DELETE 并保持参照完整性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35124238/

相关文章:

mysql - 如何获取具有连接的查询的计数

mysql - 对值添加约束,Mysql

c# - 通过来自 Controller 的查询查看与 FK 连接的多个模型

sql - BigQuery JOIN 错误

mysql - 具有多个条件的一对多关系的联合

MySQL - DISTINCT 与 HAVING SUM

sql - 如何编写 SQL 查询以从记录中获取按列逗号分隔的值列表

sql - 使 postgreSQL 脚本可配置

php - Mysql 子选择查询优化

php - 从数据库中的结果返回最接近当前时间的时间