如果不存在,mysql插入不起作用创建重复键

Posted

技术标签:

【中文标题】如果不存在,mysql插入不起作用创建重复键【英文标题】:mysql insert if not exists doesn't work creating duplicate keys 【发布时间】:2019-08-14 13:39:33 【问题描述】:

虽然我使用的是mysql“插入忽略”语句

在名为 software 的表中插入一行

我想确保我不会插入表中已经存在的软件。

我的表叫软件,我想插入

此表的新软件,但如果它已经存在

存在于表中,我想要跳过插入

我的桌子是这样的:

+----+-----------+
| id | name      |
+----+-----------+
|  1 | software1 |
|  2 | software2|
|  3 | software3   |
|  4 | software4   |
|    |
+----+-----------+

我使用了“插入忽略”,但它仍然会创建重复的键

MariaDB [db]> insert ignore into software values (5,'software4');

现在我可以看到有一个重复的 software4 键

+----+-----------+
| id | name      |
+----+-----------+
|  1 | software1 |
|  2 | software2|
|  3 | software3   |
|  4 | software4   |
|  5   software4
+----+-----------+

虽然我可以在这里看到类似的问题:

mysql insert only if not exists doesn't work

因为我是 mysql 新手,所以对我没有帮助

【问题讨论】:

您的表是如何定义的,尤其是在键或(唯一)索引方面? @koren 的答案有帮助吗? 【参考方案1】:

检查:https://mariadb.com/kb/en/library/insert-ignore/ "通过使用 IGNORE 关键字,所有错误都将转换为警告,这不会停止插入其他行。"

如果您不希望名称中有重复条目,请将它们设为唯一:

创建表 t1 (x int UNIQUE);

【讨论】:

【参考方案2】:

首先使name 列唯一,这样您就可以确定没有重复的条目:

ALTER TABLE software ADD UNIQUE (name);

然后使用INSERT IGNORE...,如果它仍然不存在,它只会使用INSERT

【讨论】:

【参考方案3】:
INSERT INTO software (id, name)
SELECT 4, 'software4'
FROM software
WHERE NOT EXISTS(
SELECT 1 FROM software WHERE name = 'software4'
) LIMIT 1;

DEMO

这将插入记录,仅当名称不存在时。

【讨论】:

insert into softwareselect from ignore。您确定这符合您的要求吗? 如果你不给我一个小提琴来测试,那么你需要测试它。但我很确定它有效:) “WHERE”不允许没有“FROM”。 是的,你是对的。我用演示和可行的解决方案编辑了我的帖子!

以上是关于如果不存在,mysql插入不起作用创建重复键的主要内容,如果未能解决你的问题,请参考以下文章

为啥保留重复记录时h2复合主键不起作用?

PHP- MySQL 数据库插入操作不起作用 [重复]

如果 REQUIRE_ONCE 存在,HEADER 命令不起作用[重复]

MySQL - 在重复键上 - CASE WHEN THEN ELSE 不起作用

mysql 重复插入主键不报错方法

videojs ios 点击暂停键不起作用?