Php 用于交换行的Laravel事务

Php 用于交换行的Laravel事务,php,laravel,Php,Laravel,我有一个带有列的表,其中一个是id +-------+ +-------+ | id | | id | +-------+ +-------+ | 1 | \ | 5 | | 2 | --------- \ | 3 | | 3 | --------- / | 2 | | 4 |

我有一个带有列的表,其中一个是
id

+-------+                 +-------+
|    id |                 |    id |
+-------+                 +-------+
|     1 |            \    |     5 |
|     2 |   --------- \   |     3 |
|     3 |   --------- /   |     2 |
|     4 |            /    |     1 |
|     5 |                 |     4 |
|     6 |                 |     6 |
+-------+                 +-------+  

我想交换行的
id
值,这样,如果任何一个步骤失败,它必须回滚,
id
当前设置为唯一约束。如何使用Laravel中的事务交换这些
id
值?我不熟悉这一点。

首先将数据库操作包装到事务闭包中,如下所示:

DB::transaction(function () {
    DB::table('users')->update(['name' => 'Billy Bob']);

    DB::table('posts')->delete();
});
如果要交换的列在当前id列中包含任何匹配的值,则在设置主键字段id时会遇到重复冲突的问题

您最好使用所需列中的id创建一个新的临时表,用剩余的现有表数据填充它,删除该表,然后用临时表重新创建它


另外,它们是否有其他引用此表的表?如果是这种情况,更换钥匙可能会造成严重破坏。

您可以使用此

DB::transaction(function() {
      // your code goes here 
});
闭包中的所有内容都在事务中执行。

如果发生任何错误,它将自动回滚。

我认为创建另一个临时表是没有效率的。是否有任何方法可以在不使用Schema fascade的情况下删除unique,然后再将unique添加回?可以
ALTER TABLE TABLE\u name DROP PRIMARY KEY
。你多久做一次这件事会影响你的效率?啊,忘了原始查询:)我会试试。关于效率:可以有大量的行。