2009-07-07 113 views
6

编辑:当我说“SQL Server”时,我真的在谈论Management Studio。对不起,如果这是令人困惑。SSMS允许在表中重复记录,但不允许后续更新

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

我将“value1”添加到第一行,第一列,然后敲入enter - 正弦没有任何键或约束已添加,它允许我进入下一行,其中第一列的其他列行(这很好)。令我惊讶的是,它还允许我在第二行输入“value1”并输入 - 这应该是不可能的,因为现在有两个相同的行。但是,因为我只是在乱搞,所以这并没有打扰我。所以,我继续创建四行这样:

表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中的数据没有被提交....行值(s)更新或删除,不要使行是唯一的或他们改变多行(4行)。“

换句话说,SQL Server允许我输入重复的行,但是当我尝试更新行以使它们唯一时,它不会允许我引用存在重复行的原因。最糟糕的是我甚至无法删除任何行(我收到相同的错误信息)。我在这种情况下找到的唯一解决方案是删除表格并重新开始 - 这很荒谬。

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

这绝不意味着某种SQL Server hating post。我遇到这样的行为比较少见,但是当我这样做时,它真的让我落后并让我发疯。我只是不明白为什么这个程序有像这样内置的行为。就像为什么在世界上它让我首先输入重复行,如果它不打算让我修复它?

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

那么是什么回事?在接近SQL Server时是否需要某种范式更改?这是我还是SQL Server? (你可以说这是我,我可以接受。)

回答

9

所有的管理工作室曾经提供过一个界面来为你创建一些SQL并在数据库上运行它。

就你而言,每次添加一行时,都会产生一条INSERT语句。这是完全有效的。

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

这是“错误”的消息听起来完全清楚,对我有效。

至于你的意见:

令我惊讶的是,它也让我 进入第二排“VALUE1”和 进入下来 - 这应该是不可能的 因为现在有两个相同的 行。然而,因为我只是混乱,所以这并没有打扰我。

显然,这是奇怪的,打破 关系理论,但我真的不关心 因为这只是我 与创建乱围着一张桌子。

让一个数据库表允许重复项没有什么错,如果它是你所需要的,这是一个完全正确的事情。至于没有“关心”或“被打扰”,你允许重复。这是错误所在。那么你应该意识到你忘了添加主键。

1

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

在幕后,Management Studio正在执行SQL语句来执行您的操作,就像您自己键入了SQL一样。所以如果你违反规定,你付罚款。

+0

是的,我认为这是我的问题。我在脑海中想到SSMS与实际的服务器密切相关,但它实际上是发送和接收SQL语句,就像我为我的数据库编写的任何应用程序一样。 – JoeCool 2009-07-07 15:29:06

1

一个怪癖是的,但一个缺陷,没有。拥有没有唯一键的表是完全合法的,但如果存在相同的行,则无法使用SSMS中的表编辑器(或之前的企业管理器)从它删除行。

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

我不会使用表编辑器这种东西,我会脚本INSERT语句。

+0

如果SSMS允许你输入重复行但不删除它们,这对我来说似乎很腥。我看不出有任何理由允许。在我看来,它应该允许或者不允许。 – JoeCool 2009-07-07 15:01:31

+3

但是,没有条件的DELETE FROM mytable将删除记录,所以它不像您没有办法删除它们。 SSMS似乎承担了一定水平的最低能力;它不一定会监督你的一切。欢迎来编程。 – 2009-07-07 15:04:43

+2

如果添加主键,则整个问题将消失。 – 2009-07-07 15:07:40

1

我不确定如果您没有唯一的密钥,您将如何期望该工具知道要删除的行。你想让它只删除一个重复或两者?如果只有一个,它应该使用的关键是什么。

管理工作室是一个工具。它的任务不是执行完美的表格设计或基本数据库101,其中大部分时间都包含一些独特的关键字。如果你确实有一些需要重复行的疯狂商业模式会怎样?那么抱怨是不是该工具会阻止重复角色?底线为 1。无论如何,您都不应该使用该工具编辑或删除数据。你应该为大多数事情编写脚本。
2.你应该有一个独特的钥匙

不能责怪任何工具,没有这些东西到位。