2014-11-23 3 views
0

У меня есть таблица ...дублирование KEY UPDATE - получение «Integrity нарушения ограничений»

CREATE TABLE `pricing` (
    `product_id` int(11) NOT NULL, 
    `seller_id` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `price` float DEFAULT NULL, 
    `ship` float DEFAULT NULL, 
    PRIMARY KEY (`product_id`), 
    KEY `seller_id` (`seller_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

И когда я пытаюсь запустить INSERT INTO ... ON DUPLICATE KEY UPDATE, я получаю нарушение ограничения целостности, если я пытаюсь изменить seller_id :

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4984-2014-11-23 10:05:20' for key 'PRIMARY'. 

запрос SQL является:

INSERT INTO pricing 
     (product_id, price, ship, seller_id) 
VALUES (:product_id, :price, :ship, :seller_id) 
ON DUPLICATE KEY UPDATE 
    seller_id = :seller_id 

это желательно Behav IOR? Есть ли способ избежать этого? На данный момент мы используем REPLACE, но мне любопытно, что я делаю что-то неправильно или нет. Я не обновляю первичный ключ для вас, а другой регулярный неповторимый ключ - и ограничение попадает на первичный ключ.

Каков процесс, который здесь происходит?

EDIT: Я провел SQL Fiddle, и все работает нормально. Почему это может вызвать ошибки на моей машине? :/

+0

(1) Вы уверены, что весь запрос запущен? (Если запрос не включает в себя элемент «ON DUPLICATE KEY ...», он с ошибкой потерпит неудачу.) (2) Существуют ли какие-либо другие уникальные ключи или уникальные индексы? –

+0

(1) Да, потому что когда я меняю его, чтобы обновить другое поле - например, цена - он работает безупречно. (2) Нет, запрос 'CREATE TABLE', который я разместил, является точным, и нет других ключей или индексов. – casraf

+0

Запрос работает очень хорошо для сервера mysql, в котором я запущен. Что вы используете для выполнения запроса? Можете ли вы использовать его для выполнения дескриптора 2 одинаково названных заполнителей? А точка после последнего продавца_ид - это только ошибка копирования/вставки или она есть в реальном запросе? Последний из всех является основным ключом только product_id? Если да, есть ли какие-либо внешние ключи из других таблиц, возможно, указывающие на эту таблицу, или, возможно, есть триггеры, которые активируются при обновлении цены таблицы (или одного или нескольких ее столбцов). – user254948

ответ

2

Запрос, указанный вами в этой таблице, отлично подходит для меня, поэтому ошибки там нет.

При более пристально взглянуть на ошибку, однако я заметил следующее:

Дублированный запись «4984-2014-11-23 10:05:20» для ключ «PRIMARY».

Этот ключ PRIMARY очень похож на число, за которым следует дата и время, которое, скорее всего, есть. Скорее всего, есть триггер в базе данных mysql для этой таблицы.

(на основе идентификатора + дата, я бы сказал, что прочертовский что-то, чтобы следить за изменениями цен автоматически?)

Другим вариантом является возможность того, что есть внешняя ключевая проблема, хотя и основана на ошибке, скорее всего, не.

Попробуйте выполнить следующую инструкцию mysql в базе данных таблицы и взгляните на результат.

SHOW TRIGGERS 
+0

Вы правы, есть связанный триггер, и существует ограничение ограничения. Я был глуп, чтобы не думать об этом. Спасибо! – casraf

+0

Если триггер - это вставка, прежде чем, попробуйте изменить его после вставки. Таким образом, он будет выполнен только в том случае, если имеется новая новая вставка. (Я предполагаю, что в этот момент запускается триггер (перед вставкой, после/после обновления). – user254948

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