MySQL предотвращает вставку дублированного поля - PullRequest
0 голосов
/ 31 октября 2018

Я хочу предотвратить вставку строки с тем же значением поля, , где поле НЕ является ключом .

В моем случае может быть два типа вставок: первый запускается скриптом, второй - каким-то DAO на сервере. Что касается сценария, поле username уникально, однако сервер не должен предотвращать множественное username - поэтому я не могу иметь уникальный индекс в поле username.

Например:

CREATE TABLE test(
    id INT AUTO_INCREMENT,
    user_name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO test(user_name) VALUES ('alex'); 

Я попробовал предложить ответ, но он не сработал.

INSERT INTO test(user_name) VALUES ('alex') WHERE user_name NOT IN ('alex');

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Если ваша цель состоит в том, чтобы сообщить MySQL, что вы хотите запретить две строки с одинаковым значением в user_name, при этом все еще используя столбец id в качестве первичного ключа, тогда решение будет УНИКАЛЬНЫМ ИНДЕКСОМ:

 CREATE UNIQUE INDEX <IndexName> ON test(user_name)

Тем не менее, если id и user_name уникальны, то id не имеет смысла, и вам следует рассмотреть возможность отказаться от него в пользу только user_name (есть некоторые причины, которые могут сделать это улучшение менее выполнимо, но вы не упомянули ни одного из них в своем вопросе).

0 голосов
/ 01 ноября 2018

Я использовал этот подход:

INSERT INTO test(user_name) 
    SELECT ('alex' ) WHERE NOT EXISTS (select 1 from test where user_name='alex');
0 голосов
/ 31 октября 2018

Если я правильно понимаю, вам нужно Вставить Игнорировать :

Если вы используете модификатор IGNORE, ошибки, возникающие при выполнении Оператор INSERT игнорируется. Например, без IGNORE, строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице вызывает ошибку двойного ключа, и оператор отменяется. С IGNORE, строка отбрасывается и ошибки не возникает. Игнорируемые ошибки вместо этого генерировать предупреждения.

Если есть такое же значение, оно будет игнорироваться.

Вы также можете использовать Replace или Insert Into ... on Duplicate Key, это зависит от того, чего именно вы хотите достичь.

Вот хороший пост по этому вопросу: https://chartio.com/resources/tutorials/how-to-insert-if-row-does-not-exist-upsert-in-mysql/

UPDATE: По мере того, как вы обновляете свой вопрос, я также должен обновить свой ответ. Может ли быть имя пользователя Unique? В этом случае Insert Ignore и Replace также могут работать.

UPDATE2:

В крайнем случае вы можете создать такую ​​процедуру:

DROP PROCEDURE IF EXISTS InsertUserName;
DELIMITER //
CREATE PROCEDURE InsertUserName(IN name VARCHAR(255))
 BEGIN
 If NOT EXISTS (select user_name from test where user_name=name limit 1) then
 BEGIN
    insert into test (`user_name`) values (name);
 END;   
 END IF;
 END //
DELIMITER ;

Вы можете назвать это как:

call InsertUserName('alex');

Если в таблице существует alex, она не будет добавлена, если нет alex, она будет вставлена.

НО, пожалуйста, хотя бы добавьте обычный неуникальный ключ в столбец user_name, это значительно улучшит производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...