Mysql: нарушение ограничения целостности

я использую 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))»

Когда я проверил в базе данных, я получил эти скриншоты:

ТАБЛИЦА: бенефициар

ТАБЛИЦА: beneficiary_payment_info

Как вы можете видеть, есть идентификатор 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');

0

Решение

В вопросе недостаточно информации для точной диагностики проблемы.

Если 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

1

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

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