【问题标题】:Add new record if no similar one exists如果不存在类似记录,则添加新记录
【发布时间】:2015-07-31 14:40:52
【问题描述】:

MySQL 数据库表mydata 有六列,比如indexcolacolbcolccoldcole

索引为 AUTO_INCREMENT。

我有一组新值,分别是valavalbvalcvaldvale

当且仅当不存在“相似”记录时,我想将这些值插入表中,定义为其中之一(cola=valacolb=valbcolc=valc)。 (如果有这样的记录,什么都不做,我对这个数据不感兴趣。)

我想是这样的,但我无法找到正确的语法:

MERGE INTO `mydata`
USING (<something?>)
ON (insert unique key join)
WHEN NOT MATCHED BY TARGET THEN
INSERT (cola, colb, colc, cold, cole)
VALUES (vala,valb,valc,vald,vale)

【问题讨论】:

  • 你使用的是哪个数据库??
  • MySQL(编辑后的帖子)。感谢您指出遗漏!
  • 我在原始帖子中没有提到还有一个 AUTO_INCREMENT 索引字段。我怀疑这会阻止检测到重复项。
  • @Mark Smith 您可以在 sqlfiddle.com 上发布您的节目创建表和一些示例数据吗?并在此处发布链接?但可以做这样的事情 => sqlfiddle.com/#!9/7ec664/1

标签: mysql sql database merge


【解决方案1】:

您需要先将这些列添加到复合键中。

您可以使用 REPLACE 而不是 INSERT 来覆盖旧行。在处理包含重复旧行的唯一键值的新行时,REPLACE 与 INSERT IGNORE 对应:新行用于替换旧行而不是被丢弃。请参阅第 13.2.7 节,“替换语法”。

https://dev.mysql.com/doc/refman/5.0/en/insert.html

【讨论】:

  • 谢谢。我认为关键是创建一个复合主键,我已经完成了,这解决了问题。我不禁想到应该有另一种方法来做到这一点 - 对主键进行测试可能并不总是合适的 - 但这对我有用。
  • 我认为这是一个好主意,因为主键始终被编入索引,从而使您的流程更加高效。
  • 确实如此,在这种情况下,这是可能的,也是正确的做法。都好。我的观点是,在其他一些假想的情况下,这可能是不可能的/不可取的:我可能只想在没有其他匹配某些条件的情况下才添加值,这些条件不是唯一的主键。
【解决方案2】:

你可以使用这个命令:-

INSERT IGNORE INTO `mydata`(cola, colb, colc, cold, cole, colf)
VALUES (vala,valb,valc,vald,vale,valf)

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多