MySQL странная ошибка в CREATE ... SELECT: ОШИБКА 1062 (23000): повторяющаяся запись '0' для ключа 1 - PullRequest
2 голосов
/ 29 ноября 2010

Это проблемный запрос (с подразумеваемым значением: вытянуть все сущности в паре с сущностью 530 в новую таблицу с количеством пар):

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

Я интерпретирую сообщение об ошибке:

ERROR 1062 (23000): Duplicate entry '0' for key 1

как жалоба на то, что я нарушаю уникальность первичного ключа. Однако я группирую по этому значению, что должно обеспечить уникальность, верно? Тогда я подумал попробовать это:

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
;
INSERT INTO paired
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

Удивительно, но это работает без проблем, хотя, насколько я понимаю, оба должны быть эквивалентны.

Что дает?!?

Для справки:

mysql  Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1

1 Ответ

4 голосов
/ 29 ноября 2010

Ваши утверждения не эквивалентны.CREATE ... SELECT создает столбцы, которые вы упомянули в части CREATE оператора (то есть, entity_id и numrels), и, кроме того, создает столбцы для каждого столбца части SELECT оператора.Вы получите четыре столбца в новой таблице.Результаты SELECT вставляются в последние два столбца.Другие столбцы заполнены значениями по умолчанию, что приводит к нарушению уникальности вашего первичного ключа.

См. Также http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html

...