我目前正在使用一个数据库,该数据库包含一个用户表,一个权限表,一组与文档相关的表以及几个其他表,这些表在用户表中的行上具有外键依赖性。
我正在尝试从“用户”表中删除符合以下条件的所有用户条目:
我能够创建一个获取所有用户的查询,如下所示:
SELECT id
INTO MyTableVar
FROM Users
WHERE
(NOT EXISTS (SELECT Author_Id FROM ItemInstances_DocumentInstance
WHERE Users.Id = ItemInstances_DocumentInstance.Author_Id)
AND NOT EXISTS (SELECT CompletedBy_Id FROM TaskInstanceUser
WHERE Users.Id = TaskInstanceUser.CompletedBy_Id)
AND Cust_Id IS NULL
AND Id > 4)
SELECT *
FROM MyTableVar
此查询获取我要删除的所有用户ID,但是在尝试删除这些条目时出现错误
DELETE语句与REFERENCE约束“ FK_MessageUser_User”相冲突。
我对应该如何使用ID来删除MessageUser_User
表中与我要删除的用户相对应的条目感到困惑。我觉得这应该很容易,但是我想不出一种使用SQL语法的方法。
PS:我也希望就我如何编写到目前为止的查询提供一些反馈。我很想知道如何做才能使其更清洁。我是SQL的新手,需要我能获得的所有帮助。
答案 0 :(得分:0)
我猜带有外键的表没有SELECT
a.fk_bk_id AS id,
a.fk_stu_id AS stuid,
DATE(a.actual_return_date) AS ardate,
CONCAT(
DAY(a.issue_date),
' ',
MONTHNAME(a.issue_date),
' ',
YEAR(a.issue_date)
) AS idate,
CONCAT(
DAY(a.return_date),
' ',
MONTHNAME(a.return_date),
' ',
YEAR(a.return_date)
) AS rdate,
b.bk_name AS NAME,
b.bk_title AS title
(CASE WHEN return_date = NULL THEN DATEDIFF(CURRENT_DATE, a.return_date)
ELSE DATEDIFF(CURRENT_DATE, a.return_date)
END)
FROM
tbl_book_mgmt_lib AS a
INNER JOIN list_book_lib AS b
ON
a.fk_bk_id = b.pk_bk_id
INNER JOIN tbl_stu_details AS c
ON
a.fk_stu_id = c.pk_stu_id
WHERE
a.fk_stu_id = 56
,您可以从中了解here。
如果您有能力更改表上的约束,则可以执行此操作,这将允许引用表自动删除引用主表中已删除行的记录。
ON DELETE CASCADE
否则,您可以使用单独的查询从MessageUser_User中删除,该查询包含要在其外键列中删除的ID:
ALTER TABLE MessageUser_User DROP
CONSTRAINT FK_MessageUser_User;
ALTER TABLE MessageUser_User ADD
CONSTRAINT FK_MessageUser_User
FOREIGN KEY (<<IdColumnName>>)
REFERENCES Users (Id)
ON DELETE CASCADE;
关于删除查询的样式-我通常更喜欢进行左联接,然后删除右表中为空的记录:
DELETE FROM MessageUser_User WHERE ID IN (SELECT ID FROM MyTableVar );