LAST_INSERT_ID () изменяется при использовании внешнего ключа

У меня есть 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-таблицы не работают.

Я понятия не имею об этом, Кто может мне помочь?

0

Решение

Используя 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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]