Есть ли способ ограничить «ON DUPLICAYE KEY UPDATE», чтобы он запускался только в том случае, если повторяющийся ключ является ПЕРВИЧНЫМ КЛЮЧОМ таблицы? (а не, если конфликт вызван УНИКАЛЬНЫМ КЛЮЧОМ)
Например, в следующей таблице:
CREATE TABLE users (
id INT(16) UNSIGNED AUTO_INCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
PRIMARY KEY (id),
UNIQUE (username)
);
Я хотел бы запускать обновление только в том случае, если столбец id генерирует конфликт, и выдает ошибку, как обычно, в случае, если конфликт произошел из-за уникального ключа username.
Редактировать:
Я работаю над очень простым фреймворком PHP. Раньше у меня был единственный метод save(), который различал INSERT и UPDATE на основе наличия свойства id у объекта, для которого он был вызван.
Теперь я переписал этот метод, используя запрос INSERT INTO ... ON DUPLICATE KEY UPDATE, но когда я пытаюсь вставить (например) пользователя с уже существующим значением username, он обновляет этого пользователя, а не выдает ошибку.
Я знаю, что это правильное поведение, я просто хотел знать, есть ли способ достичь того же результата только на ПЕРВИЧНОМ КЛЮЧЕ.
@Uueerdo да извини, обновил вопрос






on duplicate key запускает как первичные ключи, так и уникальные ключи.
В вашем случае первичный ключ - это автоматически увеличивающийся столбец, поэтому вам не следует вставлять значение. Период.
Следовательно, вы можете получить желаемое поведение, просто исключив предложение on duplicate key и исключив id из insert.
Я недостаточно объяснил себя. Я обновил вопрос, но ваш ответ кажется довольно ясным «триггеры для первичных и уникальных ключей»
@ Снеппи. . . Я хочу подчеркнуть, что вам не следует передавать id в insert, потому что база данных устанавливает это автоматически.
на самом деле я никогда не говорил, что указываю значение id во вставке запроса
@Sneppy, если вы не указываете идентификатор, он никогда не должен вызывать конфликт.
@Uueerdo да, он генерирует конфликт в столбце username и, таким образом, обновляет эту строку. В любом случае эта таблица была просто примером. Я искал гораздо более общее решение, таким образом я хотел различать первичный ключ и уникальные ключи.
Я предполагаю, что должен был прочитать
UNIQUE(username)?