【问题标题】:insert default value of a table into another table将一个表的默认值插入另一个表
【发布时间】:2016-01-05 12:45:32
【问题描述】:

简化版:

我有一个名为books (book_id, book_title) 的表,其中book_id 是主键,类型为serial(所以它是自动分配的,无需我插入)。

我还有另一个名为 book_version (id, book_id, book_version) 的表,其中 book_id 是第一个表的外键。

我使用表格获取书名和版本。我将标题插入到第一个表中,并且必须将生成的 book_id 和版本一起插入到第二个表中。

如果没有 3 个单独的查询(一个插入第一个表,一个选择获取它的 id,一个插入第二个表),我怎么能做到这一点?

这里的想法是同一本书可能已经出版了好几次,略有变化,所以我想跟踪不同的版本。

【问题讨论】:

  • 我认为这是您只能使用triggers 解决的问题。
  • 除了散文描述之外,如果您发布表的创建语句以及 SQL,您的问题会更容易理解。
  • 插入第一个表,获取最后一个插入ID,并将此ID作为第二个表的外键插入第二个表数据
  • @devpro 在我提到的问题中,我宁愿不这样做。我试图避免三个查询:D

标签: php postgresql


【解决方案1】:

在第一个表上使用插入后触发器:

http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

插入后触发器可以引用插入的行,然后您只需运行 1 条语句即可插入版本。

您只需要通过 PHP 插入第一行,您的触发器就会安装在数据库中并在之后执行工作。

这是最好的方法,IMO。

【讨论】:

    【解决方案2】:

    我会使用存储过程并将工作委托给它。仍然会有 3 个查询,但是这 3 个查询将在 MySQL 中执行。您的 PHP 代码只会将其视为 1 个查询,

    【讨论】:

      【解决方案3】:
       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' )");
      

      ?>

      【讨论】:

        【解决方案4】:

        虽然这里有一些很好的想法(即触发器、存储过程或获取最后插入的行),但使用 Returning 功能似乎是最好的解决方案,至少在我的情况下是这样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          相关资源
          最近更新 更多