创建没有主键的UPDATE语句

时间:2014-05-07 08:35:15

标签: c# sql-server

我的代码如下:

"UPDATE Mytable SET Phone= '"+PhoneNumber+"', 
 Age= '"+Age+"' 
 Where Name= '"+Name+"'";

现在这里的名字不是唯一的,也不是主键。 当代码搜索匹配时,它必须以降序输入最新记录中的数据。

如果数据库表中的名称列表是:

  1. 亚当
  2. 史蒂夫
  3. 彼得
  4. 荷马
  5. 数据必须符合No.6-Paul'而不是' No.3-Paul'

    非常感谢

2 个答案:

答案 0 :(得分:4)

要通过已知排序进行更新,您可以使用策略通过用于生成原始查询的相同视图或投影进行更新,并且只要您在一个表中更新数据:

WITH cteUpdate AS
(
   SELECT TOP 1 *
   FROM MyTable
   WHERE Name ='Paul'
   ORDER BY YourOrderColumnsHere DESC
)
UPDATE cteUpdate
   SET Phone= @PhoneNumber, Age= @Age;

请记住还要参数化您的C#代码!

SqlFiddle here

但请注意,这很容易受到并发问题的影响,例如:如果另一个连接/用户已在此期间更新了记录(例如,自从屏幕上点击了一个按钮),您可能无法更新您认为自己的Paul

如果您需要确定性更新,没有密钥就没有很多选项。最好的选择可能是乐观并发黑客,即扩展WHERE以包含先前已知记录值的所有列,即

UPDATE ... 
WHERE Name = 'Paul' 
  and Phone='{oldValueOfPhone}' 
  and Age = '{oldValueOfAge}'; 

答案 1 :(得分:1)

这样的事情:

;with x as (
  select Phone, Age, row_number() over(partition by Name order by ID desc) as rn
  from MyTable
)
update x
set Phone= @PhoneNumber, Age=@Age
where Name= @Name and rn = 1;