ПРИ ОБНОВЛЕНИИ ДВОЙНОГО КЛЮЧА только для первичных ключей?

Есть ли способ ограничить «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, он обновляет этого пользователя, а не выдает ошибку.

Я знаю, что это правильное поведение, я просто хотел знать, есть ли способ достичь того же результата только на ПЕРВИЧНОМ КЛЮЧЕ.

Я предполагаю, что должен был прочитать UNIQUE(username)?

Uueerdo 03.07.2018 01:18

@Uueerdo да извини, обновил вопрос

Sneppy 03.07.2018 01:32
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
2
1 341
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

on duplicate key запускает как первичные ключи, так и уникальные ключи.

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

Следовательно, вы можете получить желаемое поведение, просто исключив предложение on duplicate key и исключив id из insert.

Я недостаточно объяснил себя. Я обновил вопрос, но ваш ответ кажется довольно ясным «триггеры для первичных и уникальных ключей»

Sneppy 03.07.2018 01:33

@ Снеппи. . . Я хочу подчеркнуть, что вам не следует передавать id в insert, потому что база данных устанавливает это автоматически.

Gordon Linoff 03.07.2018 01:37

на самом деле я никогда не говорил, что указываю значение id во вставке запроса

Sneppy 03.07.2018 01:42

@Sneppy, если вы не указываете идентификатор, он никогда не должен вызывать конфликт.

Uueerdo 03.07.2018 01:45

@Uueerdo да, он генерирует конфликт в столбце username и, таким образом, обновляет эту строку. В любом случае эта таблица была просто примером. Я искал гораздо более общее решение, таким образом я хотел различать первичный ключ и уникальные ключи.

Sneppy 03.07.2018 10:08

Другие вопросы по теме