错误的质量删除和更新 - 设计错误?

时间:2009-02-13 03:45:38

标签: sql language-features

为什么SQL的设计人员不需要任何更新删除语句的关键字(例如“所有”)有一个哪里条款?这只是他们的疏忽吗?如果他们这样做的话,他们本可以挽救这么多的悲伤(更不用说工作了!)。

11 个答案:

答案 0 :(得分:7)

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


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玉米饼?”

答案 1 :(得分:4)

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

尽可能在复制的奴隶上工作。如果不能,请确保备份可用,不会立即被更新破坏。当键入UPDATE或DELETE查询时,请慢慢小心地输入并在键入结束分号之前始终盯着它看几秒钟。

答案 2 :(得分:2)

在哪里写的是你需要编写一个可以在没有WHERE子句的情况下执行的SQL语句?当我输入它时,我将它们无序输入,这样在我完成之前它不是合法的SQL语句。换句话说,我输入WHERE子句,然后返回并填写DELETE或UPDATE部分。

每当我在非开发环境中执行某些操作时,我首先执行SELECT以确保使用WHERE条件获取正确的行,然后将其更改为DELETE / UPDATE。

答案 3 :(得分:1)

出于同样的原因,你可以拥有一个没有在C中匹配免费的malloc:这是你的责任。

答案 4 :(得分:1)

我不知道为什么。

我希望他们这样做。我想要更新所有的几次或删除所有我可能会打扰写WHERE 1 = 1。

当然,这不会挽救编写

的Manoj
DELETE FROM T2
  FROM Tbl T1, Tbl T2
 WHERE T1.TopLevelId = 'value'

答案 5 :(得分:1)

我从来没有见过需要删除所有记录的情况,以及几乎所有记录都应该被更新的情况。我一直认为这是一个设计缺陷。

答案 6 :(得分:1)

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

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

  • 如果没有ALL关键字,您应该无法在C ++中delete[]。如果你只想删除数组的一个元素怎么办?
  • 人们似乎喜欢的所有迭代器都是危险的而不强迫用户指定ALL。如果他们只想要一个子集怎么办?
  • Mon Dieu!如果人们在SELECT中留下WHERE子句怎么办?造成伤害的可能性非常大,可能需要数小时才能检索到所有数据,并在此期间占用有价值的DBMS连接。

请不要被冒犯,我希望你按照它的意图(轻松幽默)来接受这个。我认为,作为专业人士,我们应该知道我们在做什么。当然,我已经犯了一些漂亮的错误,例如附加到passwd文件:

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

而不是使用“>>”,这就是我现在非常彻底地测试所有潜在破坏性内容的原因。

答案 7 :(得分:1)

大量的IT东西是用户最后编写的,并且易于开发。 Sql是一个很好的例子,它可以工作,但许多(简单的)容易做的事情很难。然而,很难做到的事情就像删除所有数据一样容易。我认为这是一个设计缺陷。

答案 8 :(得分:0)

但实际上问题是你的'实时'数据有多安全。在“实时”数据库上运行未经测试的脚本会遇到麻烦。

答案 9 :(得分:0)

正如墨菲所说的那样:如果事情出错就会发生。 “全部”只是另一种情况。

答案 10 :(得分:0)

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

使用交易:)