MySQL продолжить на ошибки - PullRequest
       5

MySQL продолжить на ошибки

1 голос
/ 21 декабря 2009

У меня есть цикл foreach PHP и инструкция вставки mysql внутри него. Цикл вставляет данные в мою базу данных. Я никогда не сталкивался с этой проблемой раньше, но я думаю, что происходит, когда вставка умирает (у меня нет инструкции «или умереть» после вставки), когда она достигает дублирующейся записи. Хотя в таблице могут быть повторяющиеся записи, мне нужно просто продолжить. Есть ли что-то, что мне нужно указать, чтобы сделать это?

Я переношу некоторые записи из одной таблицы в другую. Сейчас у меня 20 записей в таблице № 1 и только 17 в таблице № 2. Мне не хватает 3 записей, но дублируется только одна из них, что нарушает ограничение на таблицу. Две другие записи должны были быть добавлены. Может кто-нибудь дать мне какой-нибудь совет здесь?

Ответы [ 5 ]

1 голос
/ 22 декабря 2009

Что происходит, так это то, что PHP выдает предупреждение, когда вставка mysql завершается неудачно, и останавливается на этом предупреждении. Лучший способ достичь вашей цели:

  1. Создание пользовательского обработчика исключений
  2. Установите PHP для использования обработчика исключений для предупреждений.
  3. Обернуть вставку в попытку / ловить
  4. Когда вы перехватываете исключение / предупреждение, регистрируйте или выводите ошибку mysql, но продолжайте выполнение скрипта.

Это позволит вашему сценарию продолжить работу без остановки, одновременно объясняя вам проблему.

0 голосов
/ 21 декабря 2009

ВСТАВИТЬ В FOO (ID, БАР) ЗНАЧЕНИЯ (1,2), (3,4) ON DUPLICATE KEY UPDATE BAR = ЗНАЧЕНИЯ (БАР)

0 голосов
/ 21 декабря 2009

Одним из способов решения этой проблемы было бы просто запросить в базе данных запись, которую вы собираетесь вставить. Таким образом, ваша серия запросов не умрет при попытке вставить повторяющуюся запись.

Несколько более эффективным решением было бы запросить [i] все [/ i] записи, которые вы собираетесь вставить в один запрос, удалить все дубликаты, а затем вставить новые.

0 голосов
/ 21 декабря 2009

Вставляете ли вы несколько строк одним оператором INSERT?

INSERT INTO xyz (x,y,z) VALUES
  (1,2,3),
  (2,3,5),
  (3,4,5),
  (4,5,6)

Тогда вы можете рассмотреть подготовленные заявления
... или добавление ключевого слова IGNORE в оператор INSERT

INSERT IGNORE INTO xyz (x,y,z) VALUES
  (1,2,3),
  (2,3,5),
  (3,4,5),
  (4,5,6)

http://dev.mysql.com/doc/refman/5.0/en/insert.html говорит:

Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого обрабатываются как предупреждения

Вы все еще можете получить предупреждения, но вставка не будет прервана.

0 голосов
/ 21 декабря 2009

Не очень хороший способ, потому что вы должны выяснить, что не так, но чтобы просто предотвратить его отмирание, попробуйте добавить @ перед функцией

@mysql_query = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...