【问题标题】:How to delete from table with composite primary key?如何从具有复合主键的表中删除?
【发布时间】:2020-12-25 12:52:21
【问题描述】:

我有一个带有复合主键的表 Role。我必须从中删除值并检查它们是否不等于某个值(在触发器中)。我需要怎么做?

表格代码:

CREATE TABLE Role
(
    roleName VARCHAR(50),
    groupId  INT,
    CONSTRAINT FK_Group FOREIGN KEY (groupId) REFERENCES [Group] (groupId),
    PRIMARY KEY (roleName, groupId),
    canBan   TINYINT DEFAULT (0) /* 0 or 1 */
)

触发代码,未获批准


CREATE TRIGGER DeleteRoleTrigger
    ON [Role]
    INSTEAD OF DELETE
    AS
BEGIN
    IF 'everyone' IN (SELECT roleName FROM deleted)
        BEGIN
            THROW 50002, 'Cannot delete role "everyone"! Nothing is deleted', 1
            --   id severity state
        END
    ELSE
        BEGIN
            -- todo
            DELETE
            FROM Role
            WHERE (EXISTS(SELECT groupId, roleName FROM deleted))

            PRINT N'Роль удалена'
        END
END
GO

【问题讨论】:

  • exists 子查询与外部 (delete) 查询不相关。如果deleted 中存在任何 行,那么它将删除Role 中的所有 行。可能不是所需的功能。

标签: sql sql-server database tsql


【解决方案1】:

问题可能出在WHERE (EXISTS(SELECT groupId, roleName FROM deleted)) 行。我建议在delete语句中使用inner join,如下。

DELETE r
FROM Role r
INNER JOIN deleted d
  ON r.groupId = d.groupId AND r.roleName = d.roleName

【讨论】:

    【解决方案2】:

    您可能需要更改此触发器的 ELSE 部分

    DELETE r
    FROM [Role] r join deleted d
    on (r.groupId = d.groupId and r.roleName =d.roleName)
    

    或者

    DELETE r
    FROM [Role] r WHERE EXISTS(SELECT 1 FROM deleted d
    WHERE d.groupId=r.groupId and d.roleName=r.roleName)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多