为什么SQL Server默认不强制使用WHERE子句?

Jos*_*osh 11 sql t-sql sql-server

对我来说似乎没什么好事.我听过很多关于人们在UPDATE或DELETE中忘记WHERE子句并且废弃整个表的故事.我知道粗心的人不应该直接发出查询而且所有这些...并且存在您希望影响所有行的合法情况,但是默认情况下有一个选项需要这样的查询才有意义写得像:

UPDATE MyTable SET MyColumn = 0 WHERE *
Run Code Online (Sandbox Code Playgroud)

或者不改变语言,

UPDATE MyTable SET MyColumn = 0 WHERE 1 = 1 -- tacky, I know
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 10

因为规范不需要它,所以你不应该直接针对生产数据运行ad hoc sql.

  • @Mike Woodhouse:不小心输入"WHERE 1 = 1"然后很快意外击中F5会更加困难.我不喜欢我可以通过一次错误的按键来删除数据.只是让它成为一个*选项*(就像MySQL中的情况一样)几乎不会让人们成群结队地离开. (7认同)
  • "不应该直接针对生产数据运行ad hoc sql".大声笑.人们也不应该超过高速公路上的限速 - 但他们确实如此,人们现在被迫系好安全带以防止受伤.OP想知道为什么SQL领域不需要安全带. (6认同)
  • 安全带至少应该是一种选择 (6认同)
  • 虽然安全带应该是一个选择,恕我直言,没有必要是任何.我们是程序员,并且被赋予了强大的力量,能够引起数据库的兴衰; 我们必须在日常工作中承担很大的责任和关心.如果有安全带,管理员可以启用安全带,但我认为我们不应该期待安全带. (2认同)

Rob*_*bin 6

为了安全起见,我们总是可以在交易中运行:

BEGIN TRAN

UPDATE MyTable SET MyColumn = 0
Run Code Online (Sandbox Code Playgroud)

然后,如果行计数看起来很好:

COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)


小智 5

乔尔,我认为乔什问题的要点是为什么规范不要求它,或者至少有一个选项设置使特定数据库需要它?

由于规范并不像您所说的那样要求它,因此错误的查询(无论是临时的还是简单的程序错误)有可能更改数据库中您不打算更改的行。

隐式的“ALL ROWS”似乎比隐式的“NO ROWS”更危险。

  • 我不得不同意,如果它是隐式的 NO ROWS,这可能符合所有人的最大利益。 (2认同)

duf*_*ymo 5

是不是可以在客户端会话中将auto commit设置为false作为默认值?您必须发出"提交"以便以这种方式查看您的更改,几乎"您确定要执行此操作吗?" 时尚.

我认为这是前雇主的所有Oracle TOAD客户的默认设置.