Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何安全地交换其他表中引用的两行的ID?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何安全地交换其他表中引用的两行的ID?

Sql 如何安全地交换其他表中引用的两行的ID?,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我有一张像这样的桌子 Table 1 ============= id | ... ============= 1 | ... 2 | ... 3 | ... . . . . . . Table 2 ======================= id | table1_id | ... ======================= 1 | 1 | ... 2 | 1 | ... 3

假设我有一张像这样的桌子

   Table 1 
=============
id | ... 
=============
 1 | ... 
 2 | ... 
 3 | ...
 .    .
 .    .
 .    .

       Table 2 
=======================
id | table1_id | ... 
=======================
 1 |     1     | ... 
 2 |     1     | ... 
 3 |     2     | ... 
 .       .        .
 .       .        . 
 .       .        . 
其中
表2中的
表1\u id
引用了
表1中的
id

我想在
id=1
id=2
的行中添加
id
s


我可以在不破坏关系的情况下这样做吗?

我会在表1中创建一个带有新id的临时条目,将表2中的引用从
表1_id=1
移动到新id,将
表1\u id=2
移动到
表1\u id=1
,然后将临时引用移动到
表1\u id=2
,我将在表1中创建一个带有新id的临时条目,将表2中的引用从
表1\u id=1
移动到新id,将
表1\u id=2
移动到
表1\u id=1
,然后将临时引用移动到
表1\u id=2

向表1添加一个虚拟行

更新表2:
更新表2设置表1 id=dummyid,其中表1 id=1

然后:
更新table2设置table1 id=1,其中table1 id=2

最后:
更新table2设置table1 id=2,其中table1 id=dummyid


您也可以使用此逻辑更改表1。

向表1添加一个虚拟行

更新表2:
更新表2设置表1 id=dummyid,其中表1 id=1

然后:
更新table2设置table1 id=1,其中table1 id=2

最后:
更新table2设置table1 id=2,其中table1 id=dummyid


您也可以使用此逻辑更改表1。

使用新id在[表1]中插入id为1行副本的伪条目。然后使用以下查询更新id为2的id为1的所有列

UPDATE  T
SET T.col2  = S.col2
    ,T.col3 = S.col3
    ,T.col4 = S.col4
    .     = .
    .     = .
    .     = .
[Table 1] T
    CROSS JOIN ( SELECT col2
            ,col3
            ,col4
            .
            .
         FROM [Table 1]
         WHERE id = 2
        ) S
WHERE id = 1

以同样的方式,使用新创建的行更新行id 2的所有列。在此之后,删除新创建的行。

在具有新id的[表1]中插入一个具有id 1行副本的伪条目。然后使用以下查询将id 1的所有列更新为id 2

UPDATE  T
SET T.col2  = S.col2
    ,T.col3 = S.col3
    ,T.col4 = S.col4
    .     = .
    .     = .
    .     = .
[Table 1] T
    CROSS JOIN ( SELECT col2
            ,col3
            ,col4
            .
            .
         FROM [Table 1]
         WHERE id = 2
        ) S
WHERE id = 1
以同样的方式,使用新创建的行更新行id 2的所有列。在此之后,删除新创建的行。

是否因为更容易而将fk(表1\u id)作为一个选项?是否因为更容易而将fk(表1\u id)作为一个选项