编辑:当我说“SQL Server”时,我实际上是在谈论Management Studio。抱歉,这令人困惑。
哦,我讨厌这种事情发生。昨天我在使用SQL Server,并尝试使用PIVOT命令来弄清楚它是如何工作的。因此,我创建了一个包含四列的新表,第一列的前几行将具有相同的值。
我在第一行,第一列中添加了“value1”,然后按回车键–因为还没有添加任何键或约束,它使我可以向下一行进入第一行,第一行中的其他列为NULL(即美好的)。令我惊讶的是,它还允许我在第二行中输入“value1”并向下输入-这应该是不可能的,因为现在有两个相同的行。但是,由于我只是在四处乱逛,所以这并没有打扰我。因此,我将继续创建四行,如下所示:
表1
Col1 Col2 Col3 Col4
---------------------------------
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Value1 NULL NULL NULL
显然,这很奇怪,并且打破了关系理论,但是我并不在乎,因为这只是我创建的一张 table 。但是,我接下来就要发生什么了。输入这些数据后,我无法对表做任何事情。如果我尝试在任何行上填写col2,col3或col4,SQL Server会因为重复行而对我大喊:“没有更新行。未提交第1行中的数据...。行值(s)更新或删除后,该行要么不唯一,要么更改了多行(4行)。”
因此,换句话说,SQL Server允许我输入重复的行,但是当我尝试更新行以使其唯一时,它不允许我输入,理由是存在重复的行。最糟糕的部分是我什至都无法删除任何行(我得到相同的错误消息)。在这种情况下,我发现的唯一解决方案是删除表并重新开始-这太荒谬了。
我的问题是,这种行为如何在已经发展了十年的知名程序中存在?我是一个没有头脑的人,我应该接受SQL Server的行为吗?对我来说,这是 Not Acceptable ,SQL Server应该永远不允许我首先输入重复的行,或者应该允许我更新重复的行,直到它们都是唯一的,然后再尝试保存。
这绝不是要成为某种SQL Server讨厌的帖子。碰到这种情况是相对罕见的,但是当我这样做时,它真的会让我落后并让我发疯。我只是不明白为什么该程序具有这样的内置行为。就像为什么在世界上,如果它不打算让我修复它,让我首先输入重复的行?
我记得当初使用MS Access时,会遇到相同的奇怪,过时的行为。几次,我不得不复制大量数据,重新创建表,然后再复制回去,因为Access允许我做它不应该做的事情,现在阻止我进行任何更改来修复它-有效产生僵局。
那么这是怎么回事?接近SQL Server时是否需要某种形式的更改?是我还是SQL Server出了问题? (您可以说是我,我可以接受。)
最佳答案
Management Studio所要做的就是提供一个UI为您创建一些SQL并在数据库上运行它。
对于您的情况,每次添加一行时,它都会产生一个INSERT语句。这是完全正确的。
然后,当您尝试使用UI从所有这些重复的记录中删除或更新单个记录时,它无法生成SQL来做到这一点。原因是,由于表上没有键,因此无法生成WHERE子句,该子句表示您尝试进行UPDATE或DELETE的记录。
它的“错误”消息对我来说听起来很清楚且有效。
至于你的评论:
To my surprise, it also allowed me to enter "value1" on the second row and enter down - this should be impossible since now there are two identical rows. However, since I was just messing around, this didn't bother me.
Obviously this is strange and breaks relational theory, but I didn't really care since this is just a table I created to mess around with.
具有允许重复的数据库表没有什么错,如果您需要的话,这是一件非常有效的事情。至于不“关怀”或“受孕”,则您允许重复。那就是错误所在。然后,您应该意识到自己忘记了添加主键。
关于sql - SSMS允许表中有重复记录,但不允许后续更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1092775/