我正在使用PHP和MySQL来调用几个命令。有一个组 - 员工交叉引用表,可以在组中添加或删除员工。我正在编写此功能,首先删除所有员工,然后在组中的每个员工中添加回来(如果组已修改)。但我想确保所有命令都通过或者让表回滚。如何确保命令以原子方式发生?
答案 0 :(得分:3)
除非我弄错,否则你正在寻找交易。
这是一个很好的起点:http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-transactions.html
答案 1 :(得分:1)
假设您的目标表支持事务,那么您需要mysqli
事务系列方法。
请参阅:
如果您的表不支持事务,您可能会毫无问题地将表类型更改为“InnoDB”,从而支持事务。首先请与您的数据库管理员联系。
答案 2 :(得分:1)
如果您使用MyIsam引擎而不是InnoDB,那么您就无法利用交易。在这种情况下,您最好的选择是执行所有INSERTS第一次(您的交叉引用表应该有一个双字段唯一约束,因此重复将无声地失败)。然后执行单个DELETE:
DELETE FROM employees_groups
WHERE group_id = <groupid>
AND employee_id NOT IN (list of employee ids you just inserted)