Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql SSMS允许表中存在重复记录,但不允许后续更新_Sql_Sql Server 2008_Ssms - Fatal编程技术网

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

Sql SSMS允许表中存在重复记录,但不允许后续更新,sql,sql-server-2008,ssms,Sql,Sql Server 2008,Ssms,编辑:当我说“SQL Server”时,我实际上是在说管理工作室。抱歉,这让人困惑。 哦,我讨厌这样的事情发生。昨天我正在使用SQL Server,并尝试使用PIVOT命令来了解它是如何工作的。因此,我创建了一个包含四列的新表,第一列的前几行的值将相同 我将“value1”添加到第一行、第一列,然后按enter键-因为还没有添加任何键或约束,它允许我向下输入下一行,第一行的其他列为null(这很好)。令我惊讶的是,它还允许我在第二行输入“value1”并输入down-这应该是不可能的,因为现在有

编辑:当我说“SQL Server”时,我实际上是在说管理工作室。抱歉,这让人困惑。

哦,我讨厌这样的事情发生。昨天我正在使用SQL Server,并尝试使用PIVOT命令来了解它是如何工作的。因此,我创建了一个包含四列的新表,第一列的前几行的值将相同

我将“value1”添加到第一行、第一列,然后按enter键-因为还没有添加任何键或约束,它允许我向下输入下一行,第一行的其他列为null(这很好)。令我惊讶的是,它还允许我在第二行输入“value1”并输入down-这应该是不可能的,因为现在有两行相同。然而,由于我只是在胡闹,这并没有困扰我。因此,我继续创建四行:

表1

Col1       Col2      Col3     Col4
---------------------------------
Value1     NULL      NULL     NULL
Value1     NULL      NULL     NULL
Value1     NULL      NULL     NULL
Value1     NULL      NULL     NULL
显然,这很奇怪,打破了关系理论,但我并不在意,因为这只是我创建的一张桌子。然而,对于接下来发生的事情,我简直是怒不可遏。在我输入了这些数据之后,我无法对表做任何事情。如果我试图在任何一行上填写col2、col3或col4,SQL Server会因为有重复的行而对我大喊大叫:“没有更新任何行。第1行中的数据没有提交……更新或删除的行值不是使该行唯一,就是更改了多行(4行)。”

换句话说,SQL Server允许我输入重复的行,但当我尝试更新行以使其唯一时,它不允许我输入重复的行,原因是存在重复的行。最糟糕的是,我甚至不能删除任何行(我收到相同的错误消息)。在这个场景中,我发现的唯一解决方案是删除表并重新开始——这太荒谬了

我的问题是,在一个已经发展了十多年的著名程序中,这种行为怎么可能存在?我是一个没有头脑的人,我应该接受SQL Server的行为吗?对我来说,这是不可接受的,SQL Server不应该首先允许我输入重复的行,或者应该允许我更新重复的行,直到它们都是唯一的,然后尝试保存

这绝不是什么讨厌SQL Server的帖子。我很少遇到这样的行为,但当我这样做的时候,它真的会让我落后,让我发疯。我只是不明白为什么程序会有这样的行为。比如,如果它不打算让我修复它,为什么它首先让我输入重复的行

我记得在那天与MS Access一起工作时,我也会遇到同样的奇怪、过时的行为。有几次,我不得不复制出大量数据,重新创建表,然后将其复制回来,仅仅因为Access允许我做它不应该做的事情,现在阻止我进行任何修改来修复它——实际上产生了死锁


这是怎么回事?在接近SQL Server时,我是否需要某种范式的改变?问题出在我还是SQL Server?(你可以说是我,我可以接受。)

Sql Server Management Studio中的记录编辑器是Sql Server产品中的一个小部分(而且相对不重要)。我认为您可以安全地接受编辑器的怪癖,而不必担心服务器本身的相对质量


在幕后,ManagementStudio正在执行SQL语句来执行您的操作,就像您自己键入SQL一样。因此,如果您违反了规则,您将支付罚款。

怪癖是,但缺陷是,不。表没有唯一键是完全合法的,但如果有相同的行,则无法使用SSMS中的表编辑器(或之前的Enterprise Manager)从表中删除行

让您创建重复行的不是SSMS,而是您在创建没有主键的表时允许的。您始终可以创建一个自动递增的标识列来解决此问题


我不会将表编辑器用于这类内容,我会编写插入语句的脚本。

ManagementStudio所做的就是提供一个UI来为您创建一些SQL并在DB上运行它

在您的例子中,每次添加一行时,它都会生成一条INSERT语句。这是完全正确的

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

对我来说,“错误”信息听起来非常清晰有效

关于你的评论:

令我惊讶的是,它也让我 在第二行输入“value1”,然后 输入down-这应该是不可能的 从现在起,有两个相同的 排。但是,因为我刚刚 胡闹,这并没有打扰我

很明显,这很奇怪,而且会断裂 关系理论,但我真的没有 小心,因为这只是一张桌子 制造来捣乱的


拥有一个允许重复的数据库表并没有什么错,如果您需要的话,这是一个非常有效的方法。至于不“关心”或“烦恼”你允许复制。这就是错误所在。这时,您应该意识到您忘记添加主键。

如果您没有唯一的键,我不确定您如何期望工具知道要删除哪一行。您希望它只删除其中一个副本还是同时删除两个副本?如果只有一个,那么它应该使用什么键

management studio是一个工具。它的工作不是强制执行完美的表格