【问题标题】:what does "delete from table where NULL = NULL" means?“从 NULL = NULL 的表中删除”是什么意思?
【发布时间】:2010-07-08 06:35:18
【问题描述】:

delete from table where NULL = NULL 是什么意思?

【问题讨论】:

  • 表示你正在面试。

标签: mysql sql null sql-delete


【解决方案1】:

这不会从表中删除任何内容。 NULL 不等于 NULL。

现在

从 NULL 为 NULL 的表中删除

从表中删除所有行。

【讨论】:

  • +1 表示 NULL != NULL。多一点解释,因为我喜欢这种区别。在数据库术语中,NULL 可能意味着缺乏信息——即,无论出于何种原因,都没有提供信息——或未知信息,但你不知道是哪一个。因此,没有两个 NULL 是相同的。
  • 对,两个NULL也不一样。如果您不知道这些值,则无法确定它们是否相同或是否不同。因此,任何比较都会产生 unknown,它不是 false,但也绝对不是 true
  • +1 但有一点需要注意。仅在标准 SQL 中如此,并非所有 RDBMS 都提供相同的标准 SQL 方言。我没有将其作为答案发布,因为该问题已标记为 mysql,但在 MS SQL Server 中,如果您首先发出 set ansi_nulls off,那么 delete from table when null = null 将删除所有行,因为使用此开关 @987654323 @ 变为真。
【解决方案2】:

这意味着不要删除任何东西,因为 NULL 永远不会等于任何东西。或者它可能意味着“除非用户的 DBMS 真的很糟糕,否则不要删除任何东西,在这种情况下,出于恶意删除它”。

说真的,这种结构通常是在程序生成 WHERE 子句时产生的——而不是为“什么都不做”创建一个特殊情况,有时只生成一个导致数据库什么都不做的 WHERE 子句更简单.不过,我经常看到“WHERE 0 = 1”,这不那么含糊。

【讨论】:

  • +1 用于猜测生成的查询 - 这是我阅读问题时想到的第一件事。
【解决方案3】:

在SQL中,有三个逻辑值,即TRUE、FALSE和UNKNOWN。当我们将 null 与 null 进行比较时,使用 null=null,该操作将返回 UNKNOWN。此外,在 WHERE 子句中,所有 UNKNOWN 值都被过滤掉。因此查询什么也不做。

【讨论】:

    【解决方案4】:

    它会惩罚在数据库中将 ANSI_NULLS 设置为关闭的人:)

    【讨论】:

      【解决方案5】:

      由于 NULL 不等于 NULL,因此该语句不会执行任何操作。它等于:

      DELETE FROM TABLE WHERE 0
      

      【讨论】:

        【解决方案6】:

        回顾:

        mysql> select null = null, null <> null, null is null, null = 1, null <> 1;
        +-------------+--------------+--------------+----------+-----------+
        | null = null | null <> null | null is null | null = 1 | null <> 1 |
        +-------------+--------------+--------------+----------+-----------+
        |        NULL |         NULL |            1 |     NULL |      NULL |
        +-------------+--------------+--------------+----------+-----------+
        1 row in set (0.00 sec)
        
        
        mysql> select count(*) from table;
        +----------+
        | count(*) |
        +----------+
        |     10   |
        +----------+
        1 row in set (0.33 sec)
        
        
        mysql> select * from table where null;
        Empty set (0.00 sec)
        

        意思是,如果条件评估为 null,MySql 将其视为 false,因此 delete from table where NULL = NULL 实际上不会删除任何内容。

        NULL 是Codd 指出的特殊野兽

        【讨论】:

        • 声明 null 被认为是 false 是不是有点令人困惑(因为 NOT null 必须为 true,但事实并非如此)?
        • 是的,它令人困惑,但我在这里专门谈论条件。但整个 null 的事情非常令人困惑。
        • null 不被认为是假的,但它也不被认为是真的。 WHERE 检查表达式的计算结果是否为真。
        • Null 表示您不知道值。你不能说你不知道的东西等于你不知道的东西。同样,你不能说这两个东西不相等。严格来说 NULL = NULL 应该评估为 NULL 因为你不知道这两个东西是否相等。然而,对于大多数情况来说,False 已经足够了。
        【解决方案7】:

        我想它取决于数据库,但据我所知,它不应该实现任何目标,因为 NULL 永远不会等于 NULL,至少在 db 理论中是这样。

        【讨论】:

          【解决方案8】:

          此 SQL 命令不会影响任何一行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-05
            • 2013-05-09
            • 2017-05-25
            • 2014-01-19
            • 1970-01-01
            • 2012-09-17
            • 1970-01-01
            • 2012-10-13
            相关资源
            最近更新 更多