我要防止插入具有相同字段值的行,其中字段不是键。
在我的例子中可能有两种类型的插入:第一种由脚本运行,第二种由服务器中的某个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条答案
按热度按时间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:
最后,您可以创建如下过程:
你可以这样称呼它:
如果
alex
表中存在,如果没有,则不会添加alex
它将插入它。但请至少在
user_name
列,它将大大提高性能。7qhs6swi2#
我用这种方法:
lf5gs5x23#
如果您的目标是告诉mysql您希望它禁止在
user_name
在仍然使用id
列作为主键,则解决方案是唯一索引:也就是说,如果两者都是
id
以及user_name
是独一无二的id
是没有用的,你应该考虑放弃它而只是user_name
(有一些原因可能会降低这种改进的可行性,但您在问题中没有提及其中任何一个)。