2013-09-11 6 views
3

Я читал о том, как использовать вставку MySQL для дублирования, чтобы проверить, не позволит ли я избежать выбора. Выбираем строку, проверяя ее существует, а затем либо вставка, либо обновление. Однако, прочитав документацию, меня разделяет одна область. Это то, что документация говорит:MySQL «Вставить ... на дубликат ключа» с несколькими уникальными ключами

Если вы указываете ON DUPLICATE KEY UPDATE, и вставляется строка, которая будет вызывать повторяющееся значение в уникальный индекс или первичный ключ, обновление старой строки выполняется

Дело в том, что я не хочу знать, будет ли это работать для моей проблемы, потому что «условие», которое я для не вставки нового, - это наличие строки, которая имеет два столбца, равные определенному значение, не обязательно, что первичный ключ тот же. Сейчас синтаксис я себе это, но я не знаю, если он всегда будет вставить вместо замены:

INSERT INTO attendance (event_id, user_id, status) VALUES(some_event_number, some_user_id, some_status) ON DUPLICATE KEY UPDATE status=1 

Дело в том, event_id и user_id не являются первичными ключами, но если ряд в таблице «посещаемость» уже есть те столбцы с этими значениями, я просто хочу ее обновить. В противном случае я хотел бы вставить его. Возможно ли это с помощью ON DUPLICATE? Если нет, какой другой метод я могу использовать?

ответ

3

Если бы я был вами, я сделал бы основной ключ из event_id и user_id. Это сделает это очень легко с ON DUPLICATE.

SQLFiddle

create table attendance (
    event_id int, 
    user_id int, 
    status varchar(100), 
    primary key(event_id, user_id) 
); 

Затем с легкостью:

insert into attendance (event_id, user_id, status) values(some_event_number, some_user_id, some_status) 
on duplicate key 
update status = values(status); 
+0

Что такое «первичный ключ (event_id, user_id)»? Создает ли он первичный ключ? – phouse512

+0

Он делает пару event_id и user_id вашим основным ключом. Поэтому, если вы вставляете один и тот же event_id AND user_id, он будет обновляться, иначе он будет вставляться. ТОЛЬКО, если они совпадают, а не только event_id или просто user_id. Я добавил SQLFiddle, чтобы вы могли проверить это. – Tricky12

+0

, поэтому он не добавляет лишний физический столбец? – phouse512

1

Возможно, вы попытаетесь написать триггер, который проверяет, существует ли пара (event_id, user_id) в таблице перед вставкой, и если она существует, просто обновите ее.

4

Котировка включает «дублирующее значение в индексе UNIQUE». Таким образом, ваши ценности не должны быть первичным ключом:

create unique index attendance_eventid_userid on attendance(event_id, user_id); 

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

+0

в ответ ниже, Чад использовал первичный ключ аналогичным образом. Могу ли я создать уникальный индекс без создания другого столбца так же, как он сделал ниже? – phouse512

+0

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

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