2010-05-03 5 views
2

Я застрял в mySQL-запросе, используя ON DUPLICATE KEY UPDATE.mysql ON DUPLICATE KEY UPDATE

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

mySQL Error: 1062 - Duplicate entry 'hr2461809-3' for key 'fname' 

таблица выглядит следующим образом:

id int(10) NOT NULL default '0', 
picid int(10) unsigned NOT NULL default '0', 
fname varchar(255) NOT NULL default '', 
type varchar(5) NOT NULL default '.jpg', 
path varchar(255) NOT NULL default '',  
PRIMARY KEY (id), 
UNIQUE KEY fname (fname), 
KEY picid (propid) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

И запрос, разбивает это:

INSERT INTO images SET picid=732, fname='hr2461809-3', path='pictures/' ON DUPLICATE KEY UPDATE picid=732, fname='hr2461809-3', path='pictures/' 

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

Спасибо за любую помощь

+0

Почему вы используете SET с командой INSERT ??? – animuson

+0

@animuson Что в этом плохого? Любые поля, не указанные, будут установлены в их значения по умолчанию, или NULL (если разрешено). – rjh

+0

@rjh: Что не так с использованием '(picid, fname, path) VALUES (732, 'hr2461809-3', 'pictures /')'? Такие вещи делают языки такими беспорядками, почему все не могут просто придерживаться ВСТАВКИ? – animuson

ответ

3

Я думаю, что вы хотите ON DUPLICATE KEY IGNORE.

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

ON DUPLICATE KEY IGNORE отменяет вставку, если строка уже существует.

+0

Чтобы дополнительно объяснить, ON DUPLICATE KEY UPDATE просто изменяет, какая информация вставляется с запросом, поэтому, если вы сделаете то же самое, все равно будет ошибка. Эта функция существует, поэтому вы можете вносить в нее изменения в одном и том же запросе, чтобы не было ошибок. – animuson

+0

Спасибо, ребята! Я ценю информацию. – julio

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

  • Нет связанных вопросов^_^