将一个表的默认值插入到另一个表中



简化版本:

我有一个名为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功能似乎是最好的解决方案,至少在我的情况下是这样。

最新更新