У меня есть 5 таблиц (A, B, C, D, E) в моем проекте.
Таблица имеет PK sysNum, который имеет значение int (255) NOT NULL AUTO_INCREMENT.
B имеет PK sheetNum, который является int (255) NOT NULL AUTO_INCREMENT, а B имеет FK sysNum. ССЫЛКИ A НА УДАЛИТЬ КАСКАД НА ОБНОВЛЕНИИ КАСКАД.
C и D имеют одинаковый FK sheetNum ССЫЛКИ B НА УДАЛИТЬ КАСКАД НА ОБНОВЛЕНИЕ КАСКАД.
E имеет FK sysNum ССЫЛКИ A НА УДАЛИТЬ КАСКАД ОБ ОБНОВЛЕНИИ КАСКАД.
Я хочу добавить много данных в эти таблицы, поэтому я выбрал транзакцию. Вот мой PHP-код:
$conn->beginTransaction();
......
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$stmt->closeCursor();
$query="insert into B (...,sysNum) VALUES(...,LAST_INSERT_ID());
insert into C (...,sheetNum) VALUES(...,LAST_INSERT_ID());
insert into D (...,sheetNum) VALUES(...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
for($i=5;$i<$eRN;$i++)
{
......
$query="insert into C (...,sheetNum) VALUES (...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
}
for($i=1;$i<$dRN;$i++)
{
......
$query="insert into D (...,sheetNum) VALUES (...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
}
...
$query="insert into E (sysNum,...) VALUES (LAST_INSERT_ID(),...);";
$stmt=$conn->query($query);
$stmt->closeCursor();
$query="insert into E (sysNum,...) values (LAST_INSERT_ID(),...);";
$stmt=$conn->query($query);
$stmt->closeCursor();
$conn->commit();
После вставки в A, sysNum, созданный auto_increment, равен 20. И после вставки в B, sheetNum равен 10, как и тот же способ A. Таким образом, sheetNum для C и D равны 10. Но sysNum для E равно 10, а не 20 ,
Примечание: эти 5 таблиц работают нормально, прежде чем я добавил столбец в A. Я установил foreign_key_checks = 0 и добавил новый столбец в A. А затем вернул Foreign_key_checks = 1 обратно, но, к сожалению, E-таблицы не работают.
Я понятия не имею об этом, Кто может мне помочь?
Используя LAST_INSERT_ID () таким образом, вы всегда получите значение из самый последний SQL-оператор, который является вашим ключом от вставки в B.
Я думаю, что вы хотите, чтобы последний оператор SQL имел значение из предыдущего оператора. Было бы лучше сохранить это значение, когда вы сделали вставку A. Вы можете использовать (для PDO)
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$id = Sconn->lastInsertId();
Для mysqli …
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$id = Sconn->insert_id;
И затем используйте это значение для вставки в таблицу E.
Других решений пока нет …