SSMS允许表中的重复记录,但不允许后续更新

Joe*_*ool 6 sql ssms sql-server-2008

编辑:当我说"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
Run Code Online (Sandbox Code Playgroud)

显然这很奇怪并打破了关系理论,但我并不在乎,因为这只是我创建的一张桌子.但是,我只是把头发拉到接下来发生的事情上.在我获得这些数据之后,我无法对表做任何事情.如果我试图填写任何行上的col2,col3或col4,SQL Server会尖叫我有重复行:"没有行更新.第1行中的数据未提交....行值(s)更新或删除要么不使行唯一,要么改变多行(4行)."

换句话说,SQL Server允许我输入重复的行,但是当我尝试更新行以使它们成为唯一时,它不允许我,因为它有重复的行作为其原因.最糟糕的是我甚至无法删除任何行(我得到相同的错误消息).我在这个场景中找到的唯一解决方案是删除表并重新开始 - 这很荒谬.

我的问题是,这种行为如何在一个已经发展了十多年的着名计划中存在?我是那个没脑子的人,我应该接受SQL Server的行为吗?对我来说,这是不可接受的,SQL Server应该从不允许我首先输入重复的行,或者它应该允许我更新重复的行,直到它们都是唯一的,然后尝试保存.

这绝不意味着某种SQL Server讨厌的帖子.我遇到这样的行为是相对罕见的,但是当我这样做时,它确实可以让我落后并让我发疯.我只是不明白为什么程序有像这样的内置行为.就像它为什么在世界上做的那样,让我先输入重复的行,如果它不打算让我修复它?

我记得当天和MS Access一起工作,我会遇到同样奇怪,古老的行为.有几次我不得不复制大量的数据,重新创建表格,然后将其复制回来只是因为Access允许我做一些它不应该做的事情,并且现在阻止我进行任何修改以修复它 - 有效地产生僵局.

那么这里发生了什么?在接近SQL Server时,我是否需要某种范式更改?这是我或SQL Server的问题吗?(你可以说是我,我可以接受它.)

Rob*_*Day 9

所有管理工作室都提供了一个UI来为您创建一些SQL并针对数据库运行它.

在您的情况下,每次添加一行时,它都会生成一个INSERT语句.这完全有效.

当您尝试使用UI从所有这些重复记录中删除或更新单个记录时,它无法生成SQL来执行此操作.原因是,由于表中没有键,因此无法生成表示您尝试更新或删除的记录的WHERE子句.

它的"错误"消息对我来说听起来非常清晰和有效.

至于你的意见:

令我惊讶的是,它还允许我在第二行输入"value1"并输入 - 这应该是不可能的,因为现在有两个相同的行.但是,因为我只是乱搞,这并没有打扰我.

显然这很奇怪并打破了关系理论,但我并不在乎,因为这只是我创建的一张桌子.

拥有一个允许重复的数据库表是没有错的,如果它是您需要的,这是完全有效的事情.至于你没有"关心"或"困扰"你允许重复.这就是错误所在.那时你应该意识到你忘了添加一个主键.