2011-09-27 208 views
0

我有一个带有表名填充但没有主键的数据库DB。意味着它可以有重复的数据。例如:我有5个家庭(f1,f2,f3,f4,f5),里面有不同的成员(成员可能有相同的名字)。所以我可以在1行以上具有完全相同类型的记录。现在我想编辑该家族的一名成员,但它正在编辑所有重复记录。我想要做的是,我只想一次更新我的数据库一次。换句话说,我想用UPDATE命令执行一次。怎么做? 我正在使用Sql Server Express,VS2010,C#4.0(如果此信息很重要)。 我很确定我的问题听起来可能对某些人来说很愚蠢(可能很多)。但这只是我的问题。任何帮助或建议将不胜感激。谢谢只执行一次Sql命令一次

+2

如果名称重复且没有主键,那么将如何识别要更新的“一个”行? –

+0

hmmm,通过检查不同的列名称,无论遇到多少行匹配,它都必须更新一个并退出。但对你的查询,一个upvote – Sandy

+0

你仍然必须回答*哪个*行更新的问题。 –

回答

2

我知道这不正是你问什么,但严重的是,最简单的方法是改变数据库有一个主键并使用它。其中记录也许是身份的关键....

不这样做,你可以只更新一个记录,但你有没有保证。这就是为什么主键如基本概念。我想这并不重要,如果他们都是一样的,所以....

如果你真的没有主键进行操作,则需要使用TOP关键字如下所示:How do I update n rows in a table?

将其设置为

UPDATE TOP 1 .... 
+0

谢谢...它的工作 – Sandy

1

添加一个标识列,ID int与自动增量上。然后使用ID进行更新。

CREATE TABLE dbo.Family 
(
    Id int NOT NULL IDENTITY (1, 1), 
    FamilyName varchar(50) NULL 
) 

update dbo.Family set FamilyName = 'xxx' where Id = y 
+0

肯定会考虑添加一个标识列 – Sandy

1

如果你因为某些原因,添加标识列:

UPDATE TOP (1) Families 
SET Whatever = 'Your Value', ... 
WHERE <Your where clause> 
+0

你如何保证这会更新正确的行? –

+0

定义“正确”。如果行都完全相同,则想法是更改它们中的任何一个。如果行不相同,不要这样做 - 使用WHERE子句获取正确的行。 – Andrew

+1

但是更新随机记录要比找到正确的记录容易得多!就像我一直说的那样,疯狂推测比实际做研究和找到正确答案要容易得多。 – Jay

0

真正的答案是:修复你的数据库设计。每个记录应该有一些唯一的标识符。添加一个自动增量字段或其他东西。

要直接回答你的问题,你可以说“update top(1)...”只更新一条记录。但是没有一些独特的标识符,你怎么知道要更新哪个记录?该方案将基本上更新一个随机记录。这需要我回到第1点。

编辑:哎呀,我原来的答案是针对不同的引擎。以上更正。

+0

我一定会检查我的数据库设计,并会考虑添加一个id列。谢谢你的帮助 – Sandy