8

我正在寻找一种在单个查询中将数据插入两个数据库表的方法,这样如果一个失败,既不保存(我不想要孤立的数据)。我遇到了一个 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 结果,那将是一个可以接受的解决方案。

提前致谢

4

4 回答 4

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());
于 2012-10-01T18:58:27.487 回答
3

你需要multi_query改用。

http://php.net/manual/en/mysqli.multi-query.php

于 2012-10-01T18:56:42.450 回答
2

确保您使用的是 InnoDB 表而不是 MyISAM 表,因为 MyISAM 不是事务性的。

要使用 InnoDB 表,请在创建它时,在结束括号后添加ENGINE=InnoDB. 默认情况下,使用 MyISAM。

于 2012-10-01T19:01:17.093 回答
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 引擎处理表。

于 2012-10-01T19:08:22.420 回答