如何为主表和辅助表编写SQL多插入查询

时间:2019-03-05 09:11:51

标签: php mysql foreign-keys

我有两个表,我想编写一个多插入查询,这样,第一个表中的PK会作为fk自动插入另一个表中。

让我们假设以下表格模式:

tblParent

ParentID (Primary Key Auto increment)
ParentValue

tblChild

ChildID (Primary Key Auto increment)
FkParentID (Foreign Key)
ChildValue

现在我想编写一个如下所示的多插入查询

INSERT INTO tblParent, tblChild (ParentValue, FkParentID, ChildValue) VALUES ('Parent 1', <ParentID of 'Parent 1'>, 'Child 1'), ('Parent 2', <ParentID of 'Parent 2'>, 'Child 2'), ('Parent 3', <ParentID of 'Parent 3'>, 'Child 3')

但是我不知道该怎么做。 我有数百万条记录要插入这些表中。而且我不想在第一个表中插入记录,然后获取父ID并在第二个表中插入记录。

编辑1:我的数据库是Mysql InnoDb

编辑2:有问题的表具有一对多关系。因此,这意味着我想在tblParent中执行一次插入操作,并对tblParent中的每条记录执行多次插入tblChild操作

编辑3:

  

我正在查看MySql文档,并遇到以下描述:

     

https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_last-insert-id

     

当前正在执行的语句不会影响LAST_INSERT_ID()的值。假设您使用一条语句生成了一个AUTO_INCREMENT值,然后在多行INSERT语句中引用了LAST_INSERT_ID(),该语句将行插入具有自己的AUTO_INCREMENT列的表中。 LAST_INSERT_ID()的值将在第二条语句中保持稳定;第二行和第二行的值不受较早行插入的影响。 (但是,如果混合使用对LAST_INSERT_ID()和LAST_INSERT_ID(expr)的引用,则效果是不确定的。)

所以我的下一个问题是,LAST_INSERT_ID在tblParent多次插入的情况下会如何表现,而每个tblParent又在tblChild中插入了多个插入

3 个答案:

答案 0 :(得分:0)

<?php
//your codes

       $inset_tblParent= "INSERT INTO tblParent (ParentValue, FkParentID, ChildValue)VALUES('Parent 1', <ParentID of 'Parent 1'>, 'Child 1')";

     $inset_tblChild= "INSERT INTO tblChild (ParentValue, FkParentID, ChildValue)VALUES('Parent 2', <ParentID of 'Parent 2'>, 'Child 2')";


//your doces            
    ?>

您可以像这样使用多个插入内容。

答案 1 :(得分:0)

您可以按照以下方式在两个表中插入数据:-

$result = INSERT INTO tblParent (ParentValue) VALUE('ABC');
if($result == true){
    $query = SELECT * tblParent ORDER BY ParentID DESC LIMIT 1;
    $row = $query->fetch_assoc();
    $ParentID = $row['ParentID'];
    INSERT INTO tblChild (FkParentID,ChildValue) VALUE('$ParentID','XYZ');
}

答案 2 :(得分:0)

无论如何,现在我所做的是使用multi_query插入值。

我在while循环中做了以下操作:

$autoIncForParent = <Max ID from tblParent>;
while(<condition to evaluate>) {
    if (!empty($multiQuery)) {
        $multiQuery .= ";";
    }
    $multiQuery .= "INSERT INTO tblParent (ParentID , ParentValue) VALUES ($autoIncForParent, 'Parent 1');";
    $multiQuery .= "INSERT INTO tblChild (FkParentID , ChildValue) VALUES ($autoIncForParent, 'Child 1');";
$autoIncForParent++;
}
$mysqli->multi_query($multiQuery);

我很确定必须有另一种解决此问题的好方法。

我已经处理了内存问题,竞争条件以及实际代码中没有的内容。 此代码段仅用于详细说明。 绝对不是完美的片段,我不建议将其用于生产。

编辑1:添加了缺少的分号。万一有人提到这个