简化版本:
我有一个名为books(book_id,book_title)的表,其中book_id是主键,类型为serial(因此它是自动分配的,无需我插入)。
我还有另一个名为book_version(id,book_id,book_versions)的表,其中book_id是第一个表的外键。
我用表格记下书名和版本。我将标题插入到第一个表中,并且必须将生成的book_id和version一起插入到第二个表中。
如果没有3个单独的查询(一个插入第一个表,一个选择获取其id,一个插入第二个表),我该如何做到这一点?
这里的想法是,同一本书可能已经出版了好几次,但略有变化,所以我想跟踪不同的版本。
在第一个表上使用插入后触发器:
http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html
插入后触发器可以引用插入的行,然后只需运行1条语句即可插入版本。
您只需要通过PHP插入第一行,触发器就会安装在数据库中,然后再执行操作。
这是最好的方法,IMO.
我会使用一个存储过程并将工作委托给它。仍然会有3个查询,但这3个查询将在MySQL中执行。您的PHP代码只会将其视为一个查询,
mysql_insert_id() is mysql function which gets last inserted id into database.
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
here book_id is autofill
mysql_query("INSERT INTO books ('book_title') values ('kossu')");
$last_insert_id=mysql_insert_id();
现在对于第二个表id是自动填充
mysql_query("INSERT INTO book_version ('book_id', 'book_version') values ($last_insert_id,'6.48' )");
?>
尽管这里有一些不错的想法(即触发器、存储过程或获取最后插入的行),但使用Returning功能似乎是最好的解决方案,至少在我的情况下是这样。