如果列的组合(允许重复)是唯一的,则 MySQL 仅插入新行

标签 mysql sql if-statement primary-key composite-key

由于 IF EXISTS 不受 MySQL 支持,我正在努力思考在 MySQL 中执行类似以下伪操作的语法:

IF ((select count(*) from table where col1='var1' AND col2='var2' AND col3='var3' AND col4='var4' AND col5='var5')>0) then
    combination of vars exist in record - do a thing;
ELSE
    combination of vars does not exist in record - insert record;
END IF;

我应该认为 CASE 会适合这个,但对于我来说,我想不出正确的语法。我会使用唯一索引,但每一列都需要允许重复,它只是所有需要唯一的列的匹配组合,而不是字段本身。

我被告知在所有列中使用复合键可以避免重复插入,但据我所知,我需要使用不同的插入。

简短版本:在 MySQL 中,只有在现有行中找不到指定的精确匹配列时,我如何插入新行。

如有任何意见或建议,我们将不胜感激。

最佳答案

创建复合唯一索引。这将允许在各个字段中出现任意数量的重复项,但组合必须是唯一的。

CREATE UNIQUE INDEX ix_uq ON test (field1, field2, field3);

...如果不违反唯一索引,则使用 INSERT IGNORE 进行插入。如果是,则忽略插入。

INSERT IGNORE INTO test (field1,field2,field3) VALUES (1,1,1);

An SQLfiddle for testing .

如果你想插入除非有重复,如果有则更新,你也可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE;

INSERT INTO test (field1, field2, field3) VALUES (1,1,1)
  ON DUPLICATE KEY UPDATE field4=field4+1;

Another SQLfiddle .

关于如果列的组合(允许重复)是唯一的,则 MySQL 仅插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17956455/

相关文章:

MySQL查看问题

SQL Select ID 没有具有相同 ID 的重复行

c - 用c语言编程狡猾的if语句?

android - 我可以检查之前的 Activity 是哪个吗,Android?

if-statement - 如何检查 Jekyll 中是否存在类别/标签?

php - SQL,如果PHP值为空则忽略原因

mysql - 是否有 MySQL/MariaDB 的原生图形数据库扩展?

MySQL 工作台错误 1064

sql - 我可以关闭 SSMS 但保持存储过程运行吗?

mysql - 在MYSQL中查找最大值,但是如果最大值驻留在两行中怎么办