我正在寻找一种方法,在单个查询中将数据插入到两个数据库表中,如果一个失败,则既不保存(我也不想要孤立的数据)。我遇到了一个Stack Overflow问题,该问题向我展示了如何使用BEGIN ... COMMIT来完成此任务,但它根本无效。
以下是我设置的查询:
$query = "BEGIN;
INSERT INTO content_subpages (title, url_referer) VALUES ('$pagetitle','$url_referer');
INSERT INTO ccm_main_menu (sub_item, sub_item_link,sub_item_sort_order) VALUES ('$pagetitle','$url_referer','$newsort');
COMMIT;";
mysql_query($query) or die (mysql_error());
我收到以下错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO content_subpages (title, url_referer) VALUES ('TESTING','testing'); ' at line 2
这是我第一次使用BEGIN ... COMMIT,所以我可能做错了是合理的,但是我遵循了我提到的Stack Overflow问题的选定答案给出的SQL Fiddle示例的语法(http ://stackoverflow.com/questions/12649706/mysql-insert-into-multiple-tables-in-same-query-with-begincommit),但它仍然不起作用。
如果我可以在没有BEGIN ... COMMIT的情况下轻松实现“全有或全无”的多个INSERT结果,那将是一个可接受的解决方案。
提前致谢
答案 0 :(得分:7)
尝试将这些行分成多个php语句:
$query = "BEGIN";
mysql_query($query) or die (mysql_error());
$query = "INSERT INTO content_subpages (title, url_referer) VALUES ('$pagetitle','$url_referer')";
mysql_query($query) or die (mysql_error());
$query = "INSERT INTO ccm_main_menu (sub_item, sub_item_link,sub_item_sort_order) VALUES ('$pagetitle','$url_referer','$newsort')";
mysql_query($query) or die (mysql_error())
$query = "COMMIT";
mysql_query($query) or die (mysql_error());
答案 1 :(得分:3)
您需要改为使用multi_query
。
答案 2 :(得分:1)
确保您使用的是InnoDB表,而不是MyISAM表,因为MyISAM不是事务性的。
要使用InnoDB表,在创建它时,在结束表后,添加ENGINE=InnoDB
。默认情况下,使用MyISAM。
答案 3 :(得分:0)
尝试:
$dbh->beginTransaction();
$query = "INSERT INTO content_subpages (title, url_referer) VALUES ('$pagetitle','$url_referer');
INSERT INTO ccm_main_menu (sub_item, sub_item_link,sub_item_sort_order) VALUES ('$pagetitle','$url_referer','$newsort')";
$dbh->exec($query);
$dbh->commit();
顺便说一下,Simon Germain得到了一个好处,Transaction将使用InnoDB引擎处理表。