я использую cleardb
для базы данных MySQL в php
, И ситуация примерно такая:
Я добавляю запись в beneficiary
Таблица. и после добавления, что я получаю last_inserted _id
, И используя это id
добавить способ оплаты в beneficiary_payment_info
, В большинстве случаев работает нормально. Но иногда я обнаружил следующее сообщение в журнале ошибок:
Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (
cdb_85c337008c
,beneficiary_payment_info
, ОГРАНИЧЕНИЕbeneficiary_payment_info_ibfk_1
ИНОСТРАННЫЙ КЛЮЧ (ben_id
) РЕКОМЕНДАЦИИbeneficiary
(id
))»
Когда я проверил в базе данных, я получил эти скриншоты:
Как вы можете видеть, есть идентификатор 6073
в первой таблице, но это не во второй таблице. Я получаю выше ошибки только из-за этого. И есть две идентичные записи (6073 и 6081) в первой таблице, потому что, я думаю, пользователь запросил эту страницу во второй раз.
Как я могу решить эту проблему? Пожалуйста, ведите меня. Благодарю.
РЕДАКТИРОВАТЬ (Ответ от clearDB)
Лучший способ решить эту проблему — перестать использовать значения auto_increment.
Вместо того, чтобы пытаться угадать или установить их, вы можете использовать подзапрос, подобный следующему стилю:
INSERT INTO CHILDREN (ParentID, FirstName, LastName)
VALUES ((SELECT ID FROM PARENTS WHERE FirstName = 'John' AND LastName = 'Doe'),
'Jane', 'Doe');
В вопросе недостаточно информации для точной диагностики проблемы.
Если auto_increment_increment
установлен в значение 10
и значения 6061
, 6071
, 6081
были автоматически сгенерированы … тогда это выглядит как значение 6073
было не автоматически сгенерированное значение.
last_insert_id
функция возвращает значение, которое было автоматически генерируется; оно делает не вернуть значение, которое было явно присвоено столбцу.
(Мы отмечаем, что можно изменить значение auto_increment_increment
, Но кажется странным, что auto_increment_increment
был бы изменен со значения 10
до значения 2
, затем изменился на значение 8
, затем изменилось обратно на значение 10
, И это вовсе не объясняет наблюдаемое поведение last_insert_id
.)
копирование
И это обсуждение полностью игнорирует вероятность того, что репликация вовлечена, что 6073
значение может быть сгенерировано разные сервер. Очевидно, ClearDB поддерживает репликацию с несколькими мастерами.
Ссылка: https://www.cleardb.com/developers/help/faq#general_16
Возможно ли, что транзакция «разделилась» на двух разных серверах MySQL?
https://www.cleardb.com/developers/help/faq#general_10
Есть длинный список предостережений с использованием last_insert_id
функция. Это должно быть вызвано из того же сеанса, сразу после успешный INSERT (или UPDATE), который генерирует значение AUTO_INCREMENT, yada, yada, yada.
Ссылка: https://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id
Других решений пока нет …