C# 创建不带主键的UPDATE语句

C# 创建不带主键的UPDATE语句,c#,sql-server,C#,Sql Server,我的代码如下: "UPDATE Mytable SET Phone= '"+PhoneNumber+"', Age= '"+Age+"' Where Name= '"+Name+"'"; 现在这里的名称不是唯一的,也不是主键。 当代码搜索匹配项时,它必须按降序输入最新记录中的数据 如果数据库表中的名称列表为: 亚当 史蒂夫 保罗 彼得 荷马 保罗 数据必须符合“6号保罗”而不是“3号保罗” 非常感谢通过已知顺序进行更新,您可以使用一种策略通过用于生成原始查询的相同视图或投影进行更新,前

我的代码如下:

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

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

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

  • 亚当
  • 史蒂夫
  • 保罗
  • 彼得
  • 荷马
  • 保罗
  • 数据必须符合“6号保罗”而不是“3号保罗”


    非常感谢通过已知顺序进行更新,您可以使用一种策略通过用于生成原始查询的相同视图或投影进行更新,前提是您只更新一个表中的数据:

    WITH cteUpdate AS
    (
       SELECT TOP 1 *
       FROM MyTable
       WHERE Name ='Paul'
       ORDER BY YourOrderColumnsHere DESC
    )
    UPDATE cteUpdate
       SET Phone= @PhoneNumber, Age= @Age;
    
    请记住也要参数化你的C代码

    但是,请注意,这容易受到并发问题的影响,例如,如果另一个连接/用户已经在这段时间内更新了记录(例如,在屏幕上单击按钮之后),则您可能没有更新您认为是的
    Paul

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

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

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

    WITH cteUpdate AS
    (
       SELECT TOP 1 *
       FROM MyTable
       WHERE Name ='Paul'
       ORDER BY YourOrderColumnsHere DESC
    )
    UPDATE cteUpdate
       SET Phone= @PhoneNumber, Age= @Age;
    
    请记住也要参数化你的C代码

    但是,请注意,这容易受到并发问题的影响,例如,如果另一个连接/用户已经在这段时间内更新了记录(例如,在屏幕上单击按钮之后),则您可能没有更新您认为是的
    Paul

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

    UPDATE ... 
    WHERE Name = 'Paul' 
      and Phone='{oldValueOfPhone}' 
      and Age = '{oldValueOfAge}'; 
    
    大概是这样的:

    ;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;
    
    大概是这样的:

    ;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;
    

    “现在这里的名称不是唯一的,也不是主键”。请解释一下
    主键如何不唯一?“现在这里的名称不唯一,主键也不唯一”。想解释一下
    主键如何不唯一吗?欢迎!答应我你会参数化:)另外,注意Raj的叽叽喳喳,如果你有一个
    主键
    ,它必须是唯一的,因此你会有一个无限好用的东西作为确定性更新!我会马上把我所有的工作参数化!我正在处理的项目需要更新同名记录。再次感谢您的解决方案:)欢迎!答应我你会参数化:)另外,注意Raj的叽叽喳喳,如果你有一个
    主键
    ,它必须是唯一的,因此你会有一个无限好用的东西作为确定性更新!我会马上把我所有的工作参数化!我正在处理的项目需要更新同名记录。再次感谢您提供的解决方案:)