【发布时间】:2010-07-08 06:35:18
【问题描述】:
delete from table where NULL = NULL 是什么意思?
【问题讨论】:
-
表示你正在面试。
标签: mysql sql null sql-delete
delete from table where NULL = NULL 是什么意思?
【问题讨论】:
标签: mysql sql null sql-delete
这不会从表中删除任何内容。 NULL 不等于 NULL。
现在
从 NULL 为 NULL 的表中删除
会从表中删除所有行。
【讨论】:
set ansi_nulls off,那么 delete from table when null = null 将删除所有行,因为使用此开关 @987654323 @ 变为真。
这意味着不要删除任何东西,因为 NULL 永远不会等于任何东西。或者它可能意味着“除非用户的 DBMS 真的很糟糕,否则不要删除任何东西,在这种情况下,出于恶意删除它”。
说真的,这种结构通常是在程序生成 WHERE 子句时产生的——而不是为“什么都不做”创建一个特殊情况,有时只生成一个导致数据库什么都不做的 WHERE 子句更简单.不过,我经常看到“WHERE 0 = 1”,这不那么含糊。
【讨论】:
在SQL中,有三个逻辑值,即TRUE、FALSE和UNKNOWN。当我们将 null 与 null 进行比较时,使用 null=null,该操作将返回 UNKNOWN。此外,在 WHERE 子句中,所有 UNKNOWN 值都被过滤掉。因此查询什么也不做。
【讨论】:
它会惩罚在数据库中将 ANSI_NULLS 设置为关闭的人:)
【讨论】:
由于 NULL 不等于 NULL,因此该语句不会执行任何操作。它等于:
DELETE FROM TABLE WHERE 0
【讨论】:
回顾:
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 永远不会等于 NULL,至少在 db 理论中是这样。
【讨论】:
此 SQL 命令不会影响任何一行。
【讨论】: