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

标签 sql sql-server-2008 ssms

编辑:当我说“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/

相关文章:

scheduled-tasks - 在 SSMS 17.6 中创建维护计划后,SSMS 在尝试安排任务运行时自动重新启动

MySQL(Workbench)按大数据集(30GB)上的操作进行分组

sql - 为什么在 SSMS 中禁用登录后将用户类型更改为 SQL 用户?

mysql - 动态 SQL 查询用其他列中的值填充列

SQL,检查行是否在另一个表中

sql-server - SSMS 添加逗号分隔符 - 快捷方式

mysql - 插入重复键更新速度更快

mysql - 将时间戳日期更改为今天,但保留 hh :mm:ss part

类似于 sql 的运算符仅获取数字

sql-server - SQL 删除几乎重复的行