执行SQL查询以从数据库中删除未使用的用户

时间:2019-03-14 19:44:32

标签: sql sql-server

我目前正在使用一个数据库,该数据库包含一个用户表,一个权限表,一组与文档相关的表以及几个其他表,这些表在用户表中的行上具有外键依赖性。

我正在尝试从“用户”表中删除符合以下条件的所有用户条目:

  • 其中一个文档表中的条目未引用。
  • 权限表中的条目未引用。
  • 在“用户”行的“客户ID”列中包含空值。

我能够创建一个获取所有用户的查询,如下所示:

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的新手,需要我能获得的所有帮助。

1 个答案:

答案 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 );