更改SQL中的PK值

更改SQL中的PK值,sql,tsql,Sql,Tsql,可能这个问题是重复的。我检查了这个问题的答案。但是没有一个能解决我的问题。最后我的问题是喜欢它。 我有一张这样的人桌。 我想相互更改ID=99980和ID=99982。 ID是主键和自动递增。步骤1.重置自动递增属性和主键(将其禁用) 步骤2.运行以下更新命令: Update YourTableName SET ID=99982 WHERE ID=99980 及 步骤3.再次设置自动递增属性和主键(打开它们) 完成步骤1.重置自动增量属性和主键(将其关闭) 步骤2.运行以下更新命令: Upd

可能这个问题是重复的。我检查了这个问题的答案。但是没有一个能解决我的问题。最后我的问题是喜欢它。 我有一张这样的人桌。 我想相互更改ID=99980和ID=99982。
ID是主键和自动递增。

步骤1.重置自动递增属性和主键(将其禁用)

步骤2.运行以下更新命令:

Update YourTableName SET  ID=99982 WHERE ID=99980

步骤3.再次设置自动递增属性和主键(打开它们)


完成

步骤1.重置自动增量属性和主键(将其关闭)

步骤2.运行以下更新命令:

Update YourTableName SET  ID=99982 WHERE ID=99980

步骤3.再次设置自动递增属性和主键(打开它们)


完成

具有相同效果的替代方法是更新两条记录之间不同的非键列:

UPDATE PERSON SET FIRST_NAME='Mary', Age=25 WHERE ID=99980
UPDATE PERSON SET FIRST_NAME='John', Age=45 WHERE ID=99982

具有相同效果的另一种方法是更新两条记录之间不同的非键列:

UPDATE PERSON SET FIRST_NAME='Mary', Age=25 WHERE ID=99980
UPDATE PERSON SET FIRST_NAME='John', Age=45 WHERE ID=99982

你是说你想改变它们

如果是这样,您可以这样做:

UPDATE YOUR_TABLE
SET ID =
    CASE ID
    WHEN 99980 THEN 99982
    ELSE 99980
    END
WHERE ID IN (99980, 99982);

  • 如果数据库管理系统在SQL命令完成时强制执行约束,则这是现成的(Oracle和MS SQL Server)
  • 如果DBMS在执行命令期间强制执行约束,但也支持延迟约束,则可以通过延迟ID上的键(PostgreSQL)使其工作
  • 在一个两者都不支持的DBMS(MySQL)上,您必须使用一个已知的未占用ID作为中介将其拆分为3个更新,例如:99980->-11992->99980,-1->99982

    • 你的意思是你想改变它们

      如果是这样,您可以这样做:

      UPDATE YOUR_TABLE
      SET ID =
          CASE ID
          WHEN 99980 THEN 99982
          ELSE 99980
          END
      WHERE ID IN (99980, 99982);
      

      • 如果数据库管理系统在SQL命令完成时强制执行约束,则这是现成的(Oracle和MS SQL Server)
      • 如果DBMS在执行命令期间强制执行约束,但也支持延迟约束,则可以通过延迟ID上的键(PostgreSQL)使其工作
      • 在一个两者都不支持的DBMS(MySQL)上,您必须使用一个已知的未占用ID作为中介将其拆分为3个更新,例如:99980->-11992->99980,-1->99982

      您的问题标记为
      tsql
      oracle
      ,但oracle使用PL/SQL,而不是T-SQL。您的标识列中不能有两个ID相同的记录和一个主键。您可以更新PK字段中的值,但不应重复。由于您尝试的数据是重复的,您无法实现这一点。谢谢Justin Skiles。我更新。如果ID是PK,那么您将如何复制值99982?您的问题标记为
      tsql
      oracle
      ,但oracle使用PL/SQL,而不是T-SQL。您的标识列中不能有两个ID相同的记录和一个主键。您可以更新PK字段中的值,但不应重复。由于您尝试的数据是重复的,您无法实现这一点。谢谢Justin Skiles。我更新。如果ID是一个PK,那么您将如何复制值99982?如果我只知道ID值,我应该怎么做?在这种情况下,我喜欢@Branko的第一个建议-此解决方案有几个警告:(1)如果有备用键(这里可能不是这种情况),它将不起作用。(2) 如果ID是通过带有更新级联(Oracle不支持)的外键从另一个表引用的,则不会触发该引用操作(可能需要也可能不需要)。(3) 在一般情况下,您必须有一个额外的步骤来实际记住其中一行中的值,否则在该行被覆盖后您将不知道它们是什么。如果我只知道ID值,我该怎么办?在这种情况下,我喜欢@Branko的第一个建议-此解决方案有两个警告:(1)如果有备用键(这里可能不是这种情况),它将不起作用。(2) 如果ID是通过带有更新级联(Oracle不支持)的外键从另一个表引用的,则不会触发该引用操作(可能需要也可能不需要)。(3) 在一般情况下,您必须有一个额外的步骤来实际记住其中一行中的值,否则在该行被覆盖后您将不知道它们是什么。关闭键(或任何其他)约束将允许并发事务违反它,因此在“正常”期间通常不建议这样做数据库操作。在导入大量数据时,当您知道数据“干净”且没有并发客户端时,通常会临时禁用约束以提高性能。关闭密钥(或任何其他)约束将允许并发事务违反该约束,因此在“正常”期间通常不建议这样做数据库操作。在导入大量数据时,当您知道数据“干净”且没有并发客户端时,通常会临时禁用约束以提高性能。