2015-05-06 2 views
0

Я использую cleardb для базы данных mysql в php. И Ситуация примерно такая:Mysql: Нарушение ограничения целостности

Я добавляю запись в таблице beneficiary. и после добавления, что я получаю last_inserted _id. И используя это id, чтобы добавить способ оплаты в beneficiary_payment_info. Он отлично работает в большинстве случаев. Но, иногда я нашел ниже сообщение в журнале ошибок:

Integrity нарушение ограничения: 1452 Невозможно добавить или обновить дочернюю строку:. Ограничение внешнего ключа не удается (cdb_85c337008cbeneficiary_payment_info, скованность beneficiary_payment_info_ibfk_1 FOREIGN KEY (ben_id) Лит beneficiary (id))

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

TABLE: beneficiary

TABLE: beneficiary_payment_info

Как вы можете видеть, что есть идентификатор 6073 в первой таблице, но это не во второй таблице. Из-за этого я получаю ошибку выше. И есть две идентичные записи (6073 и 6081) в первой таблице, потому что пользователь запросил эту страницу во второй раз, я думаю.

Как я могу решить эту проблему? Пожалуйста, направляйте меня. Благодарю.

EDIT (Ответ от clearDB)

Лучший курс, чтобы решить эту проблему, чтобы остановить вовлекая значения AUTO_INCREMENT.

Вместо того, чтобы пытаться угадать или установить их, вы можете быть в состоянии использовать подзапрос, похожий на следующий стиль:

INSERT INTO CHILDREN (ParentID, FirstName, LastName) 
VALUES ((SELECT ID FROM PARENTS WHERE FirstName = 'John' AND LastName = 'Doe'), 
'Jane', 'Doe'); 
+0

Ну записи фактически не являются идентичными, они имеют разные значения опорного столбца ... так же, что до сих пор представляют проблему? Удалась ли ваша функция вставки (можете ли вы увидеть данные, которые вы пытались вставить в таблицу?) –

+0

, но проблема в том, что во второй таблице она не добавила идентификатор '6073' в качестве внешнего ключа. Теперь у меня есть 2 записи в базе данных. И тот, у которого id '6073', используется меньше. B'coz id не имеет способа оплаты во второй таблице. –

+0

У вас есть чек, чтобы убедиться, что вы вставляете в таблицу «бенефициар», работали, прежде чем вставлять в таблицу «beneficiary_payment_info»? Эта вставка может иногда не срабатывать по какой-либо причине. –

ответ

1

Там не хватает информации, данные в вопросе, чтобы точно диагностировать проблему.

Если 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 поддерживает репликацию «multi-master».

Ссылка: 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

+0

Я тоже в шоке от этой вещи _auto_increment_. И я не добавляю, что этот идентификатор явно с моей стороны. –

+0

Спасибо за справочные и четкие инструкции. Но, как мы можем решить эту проблему репликации? –

+0

Мое подозрение заключается в том, что причиной этого является репликация с несколькими мастерами/отказоустойчивость. То есть значение 6073 было создано другим сервером MySQL в кластере. После INSERT вызов функции 'last_insert_id()' не выполнялся в том же сеансе MySQL. Я думаю, что это вопрос поддержки ClearDB. ** «Как я могу достоверно получить значение идентификатора AUTO_INCREMENT, если INSERT запускается на другом сервере? Как я могу гарантировать, что' last_insert_id() 'запускается на * той же сессии MySQL? ** ** – spencer7593

Смежные вопросы