当前位置: 首页 > 面试题库 >

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

越安翔
2023-03-14
问题内容

由于MySQL不支持IF EXISTS,因此我很难考虑在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);

一个用于测试的SQLfiddle。

如果要插入(除非有重复项),然后更新(如果有),也可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE;

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

另一个SQLfiddle。



 类似资料:
  • 该程序将两个元素都添加到Set中。起初我很震惊,因为在向set添加方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后它没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc表示,它在向集合中添加时只检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为一个HashMap,在这个map中,对象的hashCode被用作键。

  • 问题内容: 该程序将两个元素都添加到集合中。起初我很震惊,因为在添加设置方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc说它在添加到Set中时仅检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为HashMap,并且在地图中,对象的hashCode用作键。因此,

  • 我需要在表中插入所有单元格的唯一数据。我的表有3列,如果所有3个单元格的值相同,我需要忽略insert。 例如,我有一个表:|column_1 | column_2 | column_3| 以及此表的值: |val 1|val 2|val 3| |val 1|val 2|val 5| |val 1|val 2|val 3| |val 1|val 2|val 3| 所以我只需要插入值1和2,因为3和

  • 我有一个程序有很多数据对象。每种方法都实现了可比性,并设置为从最高到最低(基于简单的长值)排序,包括重复的值。我希望这些对象存储在一个集合/列表中,这样我就可以遍历它,并在其各自的位置取出每个对象。 我已经研究过使用树集,但是这不允许重复,因此只保留具有相同值的多个对象中的一个。然后我找到了TreeMultiset,它可以保持元素具有相同的值。唯一的问题是,它只是存储同一对象的副本,而不是多个相等

  • 问题内容: 我有一张桌子,就是PK。当我插入行时,将有重复的键,并且我需要总结三个统计信息。我在Java中对PreparedStatement使用以下查询: 是否有更简洁的查询来实现?因为我简化了查询,所以那里有十多个统计信息。 问题答案:

  • 本文向大家介绍插入Delete GetRandom O(1)-C ++中允许重复,包括了插入Delete GetRandom O(1)-C ++中允许重复的使用技巧和注意事项,需要的朋友参考一下 假设我们要创建一个支持某些操作的数据结构,这些操作必须在O(1)的时间内执行。所以让这些操作像- insert(x):将x插入集合 remove(x):从集合中删除x getRandom():这将找到该集