4

为什么 SQL 的设计者不要求任何没有Where子句的UpdateDelete语句的关键字(例如“ All ”) ?这只是他们的疏忽吗?如果他们这样做了,他们会省去很多悲伤(更不用说工作了!)!

4

11 回答 11

7

犯了这个错误后,我虔诚地养成了打字的习惯


BEGIN TRANSACTION;

-- Select Blah

-- Some Sql here that changes Blah

-- Select Blah

ROLLBACK TRANSACTION;

然后运行它,确保受影响的行数看起来很正常,再盯着 Sql,然后替换ROLLBACKCOMMIT运行它。

它只需要 15 秒的额外时间,并为我节省了一些胃灼热,尤其是在复杂UPDATE...FROM类型的查询上。

事实上,我同意,应该有一个ALL关键字或类似的东西来防止这样的错误。或者,你的 Sql 查询环境中的一个内置选项,当我手指痉挛并在 Taco Bell 的屏幕上双击时,它就像收银机一样:“你真的是说 99 个 tacos 吗?”

于 2009-02-13T05:04:27.007 回答
4

还有很多其他非常简单的方法可以破坏您的 SQL 数据,试图捕获其中任何一种实际上只是浪费时间。没有 WHERE 的更新同样糟糕(可以说更糟)。在连接多个表的 SELECT 中省略一两个子句可能会导致它打印到您的控制台,而不是一行,一万亿。

尽可能在复制的从属服务器上工作。如果不能,请确保备份可用,不会立即被更新损坏。在键入 UPDATE 或 DELETE 查询时,请缓慢而仔细地键入,并且在键入结束分号之前始终盯着它几秒钟。

于 2009-02-13T03:55:30.013 回答
2

哪里写到你需要编写一个没有 WHERE 子句的可执行 SQL 语句?当我输入它们时,我将它们打乱了顺序,因此在我完成之前它不是合法的 SQL 语句。换句话说,我输入 WHERE 子句,然后返回并填写 DELETE 或 UPDATE 部分。

每当我在非开发环境中做某事时,我首先执行一个 SELECT 以确保我在 WHERE 条件下获得正确的行,然后将其更改为 DELETE/UPDATE。

于 2009-02-13T04:20:21.090 回答
1

出于同样的原因,您可以在 C 中使用 malloc 而不匹配 free :这是您的责任。

于 2009-02-13T03:48:44.083 回答
1

我也不知道为什么。

我真希望他们这样做。有几次我想要全部更新或全部删除,我可能会费心写 WHERE 1 = 1。

当然,这不会拯救写作的 Manoj

DELETE FROM T2
  FROM Tbl T1, Tbl T2
 WHERE T1.TopLevelId = 'value'
于 2009-02-13T03:52:37.787 回答
1

我从未见过需要删除所有记录,而很少需要更新所有记录的情况。我一直认为这是一个设计缺陷。

于 2009-02-13T03:59:36.257 回答
1

我想你会发现他们认为你会知道你在做什么,并表现出一些智慧:-)。

我知道,让我们玩“Reductio Ad Absurdum”:

  • 如果没有 ALL 关键字,您应该无法delete[]在 C++ 中使用。如果您只想删除数组的一个元素怎么办?
  • 如果不强制用户指定 ALL,所有那些人们似乎喜欢的迭代器都是危险的。如果他们只想要一个子集怎么办?
  • 星期一!如果人们要在他们的 SELECT 中留下一个 WHERE 子句怎么办?潜在的危害确实是巨大的,检索所有数据可能需要数小时,并在此期间占用宝贵的 DBMS 连接。

请不要被冒犯,我希望你能本着它的本意(轻松幽默)。我认为,作为专业人士,我们应该知道我们在做什么。诚然,我犯了一些漂亮的错误,例如将以下内容附加到 passwd 文件中:

echo "....." >/etc/passwd

而不是使用“ >>”,这就是为什么我现在非常彻底地测试我所有可能具有破坏性的东西。

于 2009-02-13T04:09:47.793 回答
1

大量的 IT 内容是(是)最后与用户一起编写的,首先是易于开发。Sql 是一个很好的例子,它可以工作,但是很多(微不足道的)简单的事情很难做到。然而,很难的事情——比如删除所有数据很容易。我认为这是一个设计缺陷。

于 2009-02-13T06:05:08.250 回答
0

但真正的问题是您的“实时”数据有多安全。在“实时”数据库上运行未经测试的脚本是自找麻烦。

于 2009-02-13T03:50:56.810 回答
0

正如墨菲所说:如果一件事会出错,它就会出错。“全部”只是另一种情况。

于 2009-02-13T04:55:23.130 回答
0

我相信这是由于 SQL 数据操作语言的集合论启发性质。

使用交易:)

于 2009-08-05T17:15:32.047 回答