Laravel:"reset"表哪个更好:->truncate() 还是 ->delete()?



我使用->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)一样)。

希望这对你有帮助

相关内容

  • 没有找到相关文章

最新更新