Laravel中插入get()查询数据时出现IDENTITY_INSERT关闭错误如何解决
报错原因
你触发错误的核心原因是:L_Examen_Categorie表的id字段被设置为自增标识列,SQL Server默认规则下,IDENTITY_INSERT参数为OFF时,不允许手动插入指定的自增列值。你从P_Examen_Categorie查询返回的结果携带了原表的id字段,直接插入到目标表就会触发该限制。
解决方案
方案1:不保留原表id值(推荐)
绝大多数场景下目标表的自增id不需要和原表保持一致,直接过滤掉id字段再插入即可,还可以优化为批量插入提升性能:
$categorie = DB::table('P_Examen_Categorie as p') ->where('p.id_examen', '=', $request->input('id_examen')) ->get() ->map(function ($item) { $insertItem = (array)$item; // 移除自增列id unset($insertItem['id']); return $insertItem; })->toArray(); // 批量插入不需要循环 L_Examen_Categorie::insert($categorie);
方案2:需要保留原表id值
如果业务要求目标表的id必须和原表id保持一致,可以临时开启目标表的IDENTITY_INSERT权限,插入完成后记得关闭:
// 开启目标表的自增列手动插入权限 DB::statement('SET IDENTITY_INSERT L_Examen_Categorie ON'); $categorie = DB::table('P_Examen_Categorie as p') ->where('p.id_examen', '=', $request->input('id_examen')) ->get() ->map(fn($item) => (array)$item) ->toArray(); L_Examen_Categorie::insert($categorie); // 插入完成后关闭权限,避免影响后续其他操作 DB::statement('SET IDENTITY_INSERT L_Examen_Categorie OFF');
注意:同一时间SQL Server只允许开启一个表的
IDENTITY_INSERT权限,操作完成后必须手动关闭。
内容的提问来源于stack exchange,提问作者drnwork
相关产品推荐
相关产品推荐

