2015-09-25 5 views
2

У меня есть таблица вроде этого:я не могу обновить таблицу, которая имеет два уникальных ключей

DROP TABLE IF EXISTS `locations`; 
CREATE TABLE IF NOT EXISTS `locations` (
    `tenant_id` int(11) NOT NULL, 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `waypoint_id` int(11) NOT NULL, 
    `material` int(11), 
    `price` decimal(10,2) NOT NULL, 
    PRIMARY KEY (`tenant_id`,`id`), 
    UNIQUE KEY `id` (`id`), 
    UNIQUE KEY(`waypoint_id`, `material`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; 

Я бегу этот вопрос:

UPDATE locations 
SET waypoint_id=23, 
material=19, 
price=22.22, 
unit_id=1 
WHERE tenant_id=3 AND id = 54; 

Я получаю следующее сообщение об ошибке:

Duplicate entry '23-19' for key 'waypoint_id' 

Я знаю, что у меня есть запись с этими идентификаторами уже, но потом, как я могу редактировать значения в этой строке, если она не позволяет мне изменить их?

Я не понимаю, почему я получаю эту ошибку, если я не пытаюсь вставить новую запись с этими идентификаторами 23-19, но я просто пытаюсь обновить эту запись. Как я могу это решить?

ПРИМЕЧАНИЕ

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

ответ

1

Ваш запрос кажется неправильным. Это должно быть так:

UPDATE locations 
SET waypoint_id=23, 
material=19, 
price=22.22, 
unit_id=1 
WHERE tenant_id=3 AND id = 54; 

EDIT:

Вы должны убедиться, что ваша таблица не имеет waypoint_id как 23 и материал, как 19, как вы сделали это уникальным. Если имеется уже повторяющаяся запись, вы не можете добавить значение 23 и значение 19.

Вы можете проверить это следующим образом:

select waypoint_id, material from locations WHERE tenant_id=3 AND id = 54; 

или, вернее, проверить, как

select * from locations where waypoint_id = 23 or material = 19 

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

alter table locations drop index waypoint_id ; 
alter table locations drop index material ; 

Тогда вы можете сделать обновление

И после этого применить уникальный ключ от сочетания двух столбцов, как это:

ALTER TABLE `locations` ADD UNIQUE `unique_index`(`waypoint_id`, `material`); 
+0

Извините, мне пришлось отредактировать мой пост. Я вставил неправильный запрос. В любом случае я использовал ваш запрос, и у меня была такая же проблема: pastie.org/private/p0v0kdwcuneepzs1h1tpna – VaTo

+0

@ SaulOrtega: - См. Обновленный ответ. Похоже, ваша таблица уже имеет столбец waypoint_id как 23, а материал - 19. Поэтому, если вы попытаетесь обновить это значение до 23 и 19 соответственно, это приведет к ошибке, которую вы сейчас получаете. Поскольку вы сделали эти два столбца уникальными –

+0

Да, у меня есть эта запись уже в моей таблице, и я знал об этом, но я хочу, чтобы отредактировать эту запись, чтобы не добавлять новую с этими идентификаторами. – VaTo

1
UNIQUE KEY(`waypoint_id`, `material`) 

Так что, когда вы сделать имеют это ограничение, вы не можете иметь 2 строк, которые имеют ту же комбинацию для этих 2 значений. Таким образом, вы не можете иметь два ряда с 23 как waypoint_id и 19 как материал, простой как это.

Это то, что единственное средство. Эта комбинация должна быть уникальной, будь то обновление или вставка.

Поскольку вы не можете предоставить два разных запроса на обновление, смешанные в одном запросе. ДОПОЛНИТЕЛЬНЫЕ местоположения SET waypoint_id = 23 WHERE tenant_id = 3 И id = 54 Запрос заканчивается там. Теперь похоже, что у вас есть только 1 обновление, но ваш синтаксис неверен. Он должен быть как места UPDATE SET waypoint_id = 23, материал = 19, цена = 22,22, unit_id = 1 WHERE tenant_id = 3 и Ид = 54
+0

Извините, что мне пришлось отредактировать свое сообщение. Я вставил неправильный запрос, в любом случае я использовал ваш запрос, и у меня возникла такая же проблема: http://pastie.org/private/p0v0kdwcuneepzs1h1tpna – VaTo

+0

Тогда посмотрите на обновленный ответ. –

+0

Но я не пытаюсь вставить новую строку с 23 как waypoint_id и 19 как материал, то, что я делаю, обновляет эту строку, которая имеет 23 как waypoint_id и 19 как материал – VaTo

0

Поскольку пользователь уверен, что он обновляет уникальную строку с условием waypoint_id=23 & material=19, запрос может быть, как показано ниже:

UPDATE locations 
SET price=22.22, unit_id=1 
WHERE waypoint_id=23 AND material=19 /*(AND tenant_id=3 AND id = 54) - condition not required*/; 
Смежные вопросы