mysql防止插入重复字段

ctehm74n  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(451)

我要防止插入具有相同字段值的行,其中字段不是键。
在我的例子中可能有两种类型的插入:第一种由脚本运行,第二种由服务器中的某个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');
efzxgjgh

efzxgjgh1#

如果我理解正确,您需要插入忽略:
如果使用ignore修饰符,则会忽略执行insert语句时发生的错误。例如,在不忽略的情况下,复制表中现有唯一索引或主键值的行将导致重复键错误,并且语句将中止。使用ignore时,将丢弃该行,并且不会发生错误。忽略的错误将生成警告。
如果有相同的值,它将忽略它。
你也可以用 Replace 或者 Insert Into ... on Duplicate Key 这取决于你到底想达到什么目的。
关于这个问题,这里有一个很好的帖子:https://chartio.com/resources/tutorials/how-to-insert-if-row-does-not-exist-upsert-in-mysql/
更新:当你更新你的问题,我必须更新我的答案以及。可能是用户名 Unique ? 那样的话 Insert Ignore 以及 Replace 也行。
更新2:
最后,您可以创建如下过程:

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 列,它将大大提高性能。

7qhs6swi

7qhs6swi2#

我用这种方法:

INSERT INTO test(user_name) 
    SELECT ('alex' ) WHERE NOT EXISTS (select 1 from test where user_name='alex');
lf5gs5x2

lf5gs5x23#

如果您的目标是告诉mysql您希望它禁止在 user_name 在仍然使用 id 列作为主键,则解决方案是唯一索引:

CREATE UNIQUE INDEX <IndexName> ON test(user_name)

也就是说,如果两者都是 id 以及 user_name 是独一无二的 id 是没有用的,你应该考虑放弃它而只是 user_name (有一些原因可能会降低这种改进的可行性,但您在问题中没有提及其中任何一个)。

相关问题