Как написать многостраничный запрос SQL для первичных и вторичных таблиц - PullRequest
0 голосов
/ 05 марта 2019

У меня есть две таблицы, и я хочу написать многостраничный запрос так, чтобы 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')

Но я не знаю, как это сделать.У меня есть миллионы записей для вставки в эти таблицы.И я не хочу вставлять запись в первую таблицу, затем извлекать родительский идентификатор и вставлять записи во вторую таблицу.

Редактировать 1: Моя база данных - Mysql InnoDb

Редактировать 2: Таблицы вВопрос имеет отношение один ко многим.Таким образом, это означает, что я хочу выполнить одну вставку в tblParent и несколько вставок в tblChild для каждой записи в tblParent

Edit 3:

Я искал в документации MySql и наткнулся на следующееdescription:

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

Выполняемый в данный момент оператор не влияет на значение LAST_INSERT_ID ().Предположим, что вы генерируете значение AUTO_INCREMENT с одним оператором, а затем ссылаетесь на LAST_INSERT_ID () в многострочном операторе INSERT, который вставляет строки в таблицу со своим собственным столбцом AUTO_INCREMENT.Значение LAST_INSERT_ID () останется стабильным во втором выражении;его значение для второй и последующих строк не зависит от более ранних вставок строк.(Однако, если вы смешаете ссылки на LAST_INSERT_ID () и LAST_INSERT_ID (expr), эффект не определен.)

Поэтому мой следующий вопрос: как поведет себя LAST_INSERT_ID в случае множественной вставки дляtblParent, который в свою очередь имеет несколько вставок в tblChild для каждого tblParent

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Вы можете вставить данные в две таблицы следующим образом: -

$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');
}
0 голосов
/ 06 марта 2019

В любом случае, сейчас я использовал 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: Добавлены пропущенные точки с запятой.В случае, если кто-то ссылается на это

0 голосов
/ 05 марта 2019
<?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            
    ?>

вы можете использовать несколько таких вставок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...