为什么 SQL 的设计者不要求任何没有Where子句的Update或Delete语句的关键字(例如“ All ”) ?这只是他们的疏忽吗?如果他们这样做了,他们会省去很多悲伤(更不用说工作了!)!
11 回答
犯了这个错误后,我虔诚地养成了打字的习惯
BEGIN TRANSACTION;
-- Select Blah
-- Some Sql here that changes Blah
-- Select Blah
ROLLBACK TRANSACTION;
然后运行它,确保受影响的行数看起来很正常,再盯着 Sql,然后替换ROLLBACK
并COMMIT
运行它。
它只需要 15 秒的额外时间,并为我节省了一些胃灼热,尤其是在复杂UPDATE...FROM
类型的查询上。
事实上,我同意,应该有一个ALL
关键字或类似的东西来防止这样的错误。或者,你的 Sql 查询环境中的一个内置选项,当我手指痉挛并在 Taco Bell 的屏幕上双击时,它就像收银机一样:“你真的是说 99 个 tacos 吗?”
还有很多其他非常简单的方法可以破坏您的 SQL 数据,试图捕获其中任何一种实际上只是浪费时间。没有 WHERE 的更新同样糟糕(可以说更糟)。在连接多个表的 SELECT 中省略一两个子句可能会导致它打印到您的控制台,而不是一行,一万亿。
尽可能在复制的从属服务器上工作。如果不能,请确保备份可用,不会立即被更新损坏。在键入 UPDATE 或 DELETE 查询时,请缓慢而仔细地键入,并且在键入结束分号之前始终盯着它几秒钟。
哪里写到你需要编写一个没有 WHERE 子句的可执行 SQL 语句?当我输入它们时,我将它们打乱了顺序,因此在我完成之前它不是合法的 SQL 语句。换句话说,我输入 WHERE 子句,然后返回并填写 DELETE 或 UPDATE 部分。
每当我在非开发环境中做某事时,我首先执行一个 SELECT 以确保我在 WHERE 条件下获得正确的行,然后将其更改为 DELETE/UPDATE。
出于同样的原因,您可以在 C 中使用 malloc 而不匹配 free :这是您的责任。
我也不知道为什么。
我真希望他们这样做。有几次我想要全部更新或全部删除,我可能会费心写 WHERE 1 = 1。
当然,这不会拯救写作的 Manoj
DELETE FROM T2
FROM Tbl T1, Tbl T2
WHERE T1.TopLevelId = 'value'
我从未见过需要删除所有记录,而很少需要更新所有记录的情况。我一直认为这是一个设计缺陷。
我想你会发现他们认为你会知道你在做什么,并表现出一些智慧:-)。
我知道,让我们玩“Reductio Ad Absurdum”:
- 如果没有 ALL 关键字,您应该无法
delete[]
在 C++ 中使用。如果您只想删除数组的一个元素怎么办? - 如果不强制用户指定 ALL,所有那些人们似乎喜欢的迭代器都是危险的。如果他们只想要一个子集怎么办?
- 星期一!如果人们要在他们的 SELECT 中留下一个 WHERE 子句怎么办?潜在的危害确实是巨大的,检索所有数据可能需要数小时,并在此期间占用宝贵的 DBMS 连接。
请不要被冒犯,我希望你能本着它的本意(轻松幽默)。我认为,作为专业人士,我们应该知道我们在做什么。诚然,我犯了一些漂亮的错误,例如将以下内容附加到 passwd 文件中:
echo "....." >/etc/passwd
而不是使用“ >>
”,这就是为什么我现在非常彻底地测试我所有可能具有破坏性的东西。
大量的 IT 内容是(是)最后与用户一起编写的,首先是易于开发。Sql 是一个很好的例子,它可以工作,但是很多(微不足道的)简单的事情很难做到。然而,很难的事情——比如删除所有数据很容易。我认为这是一个设计缺陷。
但真正的问题是您的“实时”数据有多安全。在“实时”数据库上运行未经测试的脚本是自找麻烦。
正如墨菲所说:如果一件事会出错,它就会出错。“全部”只是另一种情况。
我相信这是由于 SQL 数据操作语言的集合论启发性质。
使用交易:)