2012-05-02 4 views
1

Я хотел бы использовать «вставить в дублирующее обновление ключа» в запросе либо вставить новую строку, если она не существует, либо обновить строку, если это произойдет. То, что я не могу показаться, чтобы выяснить, как использовать это, если я не уникальный идентификатор (поскольку строка еще не был создан, и этот идентификатор будет autoincremented на вставке)Вставить при повторном обновлении ключа

insert into foodchoices (unique,notunique) values (Idonthavethis,'test') 
on duplicate key update notunique = 'stuff'; 

Теперь, этот пример выше, где он говорит «Idonthavethis», у меня нет уникального значения для этого поля, потому что он еще не был вставлен в строку. Тем не менее, я действительно ожидаю, что это вставляет как-то, я просто не знаю, как это сделать. Я ожидаю, что действовать так:

insert into foodchoices (notunique) values ('test') 

НО, если это поле, которое уже существует, я буду иметь это уникальное значение. Есть ли какая-либо форма шаблона или что-то, что я могу использовать, когда у меня нет уникального значения?

+0

Как определить, существует ли запись? Если 'notunique' действительно не уникален, то в чем разница между вставкой новой строки и выбором любой из нескольких версий со значением' 'test''? – eggyal

ответ

3

Я считаю, что ответ на этот вопрос рассматривается в MySQL docs:

Если таблица содержит столбец AUTO_INCREMENT и INSERT ... UPDATE вставляет строку, функция LAST_INSERT_ID() возвращает значение AUTO_INCREMENT. Если инструкция обновляет строку, то LAST_INSERT_ID() не имеет смысла. Однако вы можете обойти это, используя LAST_INSERT_ID(expr). Предположим, что id - столбец AUTO_INCREMENT. Чтобы сделать LAST_INSERT_ID() значимым для обновлений, введите строки следующим образом:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 
0

Я думаю, что вы просто попытаетесь сделать, это выбрать строку со значением, которое у вас есть (если существует, затем обновить), иначе вставить. Это еще одно предложение.

Я просто не вижу, как вы можете сравнить существующее значение, которое у вас просто нет (сгенерированный идентификатор). Кроме того, если идентификатор DB посеян, как он будет дублироваться?

0

Возможно, вам нужно изменить структуру таблицы для добавления каких-либо ограничений в столбец «notunique». Таким образом, вы можете:

insert into foodchoices (notunique) values ('test') on duplicate key update columntostoreyouruniqueid = unique; 

Если notunique не имеет никакого постоянного значения, значит, у вас будет уникальный элемент. Таким образом, он должен удвоить запрос.

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