【问题标题】:I want to leave always one record if table record count = 1 with SQL如果表记录计数 = 1 使用 SQL,我想始终保留一条记录
【发布时间】:2009-10-18 15:12:13
【问题描述】:

我可以用这个 SQL 子句删除记录,

DELETE FROM TABLE WHERE ID = 2

如果表计数 = 1,即使“ID=2”,我也需要始终保留一条记录。我该怎么做?

【问题讨论】:

  • 你能澄清你想要什么吗?您想删除表中除一个以外的所有行吗?还是您只想删除ID = 2除非它是表中唯一剩下的行?
  • 是的,正如你所说,我可以删除表中的所有行,除了一个。但例外的不能是静态值。 Andomar 的建议效果很好。感谢您的关注。

标签: sql sql-delete


【解决方案1】:

添加 WHERE 子句以确保多于一行:

DELETE FROM TABLE 
WHERE ID = 2
AND (SELECT COUNT(*) FROM TABLE) > 1

【讨论】:

    【解决方案2】:

    未经测试,但是这行中的某些东西可能有用吗?

    DELETE FROM TABLE WHERE ID = 2 LIMIT (SELECT COUNT(*)-1 FROM TABLE WHERE ID=2);
    

    可能会添加一个 if 语句以确保计数大于 1。

    【讨论】:

    • MySQL 不允许使用可变限制子句,请参阅:bugs.mysql.com/bug.php?id=6673
    • 哦,那你的解决方案就更好了。
    • 我无法将您的建议应用于我的项目。确定它可以工作,我绝对不能。
    【解决方案3】:

    简单的方法是禁止任何清空表的删除

    CREATE TRIGGER TRG_MyTable_D FOR DELETE
    AS
    IF NOT EXISTS (SELECT * FROM MyTable)
        ROLLBACK TRAN
    GO
    

    更复杂的是,如果你做这个清空表的多行删除呢?

    DELETE FROM TABLE WHERE ID BETWEEN 2 AND 5
    

    所以,从你刚刚删除的内容中随机重新填充

    CREATE TRIGGER TRG_MyTable_D FOR DELETE
    AS
    IF NOT EXISTS (SELECT * FROM MyTable)
        INSERT mytable (col2, col2, ..., coln)
        SELECT TOP 1 col2, col2, ..., coln FROM INSERTED --ORDER BY ??
    
    GO
    

    但是,这个要求有点危险和模糊。用英语,OK,“总是在表格中至少有一行”,但实际上是“哪一行?”

    【讨论】:

    • 也谢谢你。但是你的建议水平对于我的 SQL 知识水平来说很难:) 也许我将来可以使用你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多