MySQL多关联表同步插入时如何获取前序查询的自增ID填充关联字段
多关联表批量插入关联字段取值方案
你的插入执行顺序逻辑是正确的:先插入无外键依赖的insurance表,再插入关联insurance的customer表,最后插入关联customer的rental_details表,关联字段的值就取对应父表刚生成的自增主键值即可。
现有写法风险说明
你当前使用@@IDENTITY的写法虽然可以正常执行,但存在2个核心隐患:
- MySQL中
@@IDENTITY返回的是当前会话所有表最后一次生成的自增ID,若库内存在触发器在插入业务表后触发其他带自增主键的表写入操作,@@IDENTITY会返回触发器写入表的ID值,直接用会导致关联字段填错 - 不同数据库对
@@IDENTITY的支持逻辑有差异,兼容性不好
优化实现方案
推荐直接用PHP mysqli扩展提供的insert_id连接属性获取上一次插入的自增ID,值由PHP端持有,不会受SQL侧其他操作干扰,稳定性更高,优化后代码如下:
// 插入insurance表 if($connection->query("INSERT INTO insurance (Collision_Coverage, Medical_Coverage) VALUES ('$collision_coverage','$medical_coverage')")) { // 获取insurance表刚生成的自增ID $insurance_id = $connection->insert_id; // 插入customer表,使用刚才获取的insurance_id填充关联字段 if($connection->query("INSERT INTO customer (People_ID, Driving_License_No, Insurance_id) VALUES ('$current_user_id', '$driv_lic_num', $insurance_id)")) { // 获取customer表刚生成的自增ID $customer_id = $connection->insert_id; // 插入rental_details表,使用刚才获取的customer_id填充关联字段 if($connection->query("INSERT INTO rental_details (Vehicle_ID,Customer_ID, Hire_Date, Hire_Days, Total_cost, Return_date) VALUES ('$current_vehicle_id', $customer_id, '$pick_up_date', '$days_hired', '$total_cost', '$returning_date')"))
额外注意事项
- 直接将变量拼接进SQL语句存在SQL注入风险,推荐改用预处理语句绑定参数,安全性更高
- 三张表的插入属于强关联操作,建议开启事务控制,任意一步插入失败就回滚所有已写入数据,避免出现半完成的脏数据
内容的提问来源于stack exchange,提问作者kurwinox87
相关产品推荐
相关产品推荐

