我使用->truncate()
来删除数据,但是当我使用它时,DB::rollback()
在try catch中不执行。同时,->delete()
是由DB::rollback()
执行的,但有了它,我的自动增量不会重置为1,我试图在->delete()
之后使用DB::statement('ALTER TABLE table_name AUTO_INCREMENT = 1')
,但DB::rollback()
也不支持alter表,所以我不知道我该怎么办?
代码1:
DB::beginTransaction();
try {
DB::table('table_name')->truncate();
DB::table('table_name')->insert($data);
DB::commit();
} catch (Exception $e){
DB::rollback();
}
代码2:
DB::beginTransaction();
try {
DB::table('table_name')->delete();
DB::statement('ALTER TABLE table_name AUTO_INCREMENT = 1');
DB::table('table_name')->insert($data);
DB::commit();
} catch (Exception $e){
DB::rollback();
}
TLDR:我想删除表中的所有数据,然后用新数据从id = 1开始插入表,但这两个代码不与DB::rollback()
我自己发现了如何做到这一点,通过这样做:
DB::beginTransaction();
try {
DB::table('table_name')->where('id', $data[0]['id'])->delete(); // delete it first to avoid id duplicate when inserting, comment this if id is auto increment
$status = DB::table('table_name')->insert($data[0]); // to test whenever the insertion is successful or not
if ($status){
DB::table('table_name')->delete();
DB::statement('ALTER TABLE table_name AUTO_INCREMENT = 1');
DB::table('table_name')->insert($data);
}
DB::commit();
} catch (Exception $e){
DB::rollback();
}
formysql
13.3.2无法回滚的语句某些语句无法回滚。通常,这些语句包括数据定义语言(DDL)语句,例如那些创建或删除数据库的语句,那些创建、删除或修改表或存储例程的语句。请看这个链接
这是一个相当普遍的SQL Server信念,截断不能回滚,因为它没有被记录
TRUNCATE是一个记录操作,但是SQL Server在TRUNCATE表时不会记录每一行。SQL Server只记录TRUNCATE操作发生的事实。它还记录有关已释放的页和区段的信息。但是,只要重新分配这些页面,就有足够的信息可以回滚。日志备份只需要TRUNCATE TABLE发生的信息。要恢复TRUNCATE TABLE,只需重新应用该操作。在RESTORE期间不需要涉及的数据(就像真正的"最低记录"操作(如BULK INSERT)一样)。
希望这对你有帮助