【问题标题】:Insert a new row if it doesn't already exist based on non-unique columns [duplicate]如果基于非唯一列不存在,则插入新行[重复]
【发布时间】:2014-01-28 00:11:20
【问题描述】:

我知道INSERT ... ON DUPLICATE KEY UPDATE,但这不起作用,因为我将用于检查现有行的条件不是唯一键或主键。事实上,这将是 2 个不同的领域。它甚至不能是唯一键,因为值不会是唯一的。

这是我的虚拟插入语句

INSERT INTO 
    videos 
    (
        first_name, 
        last_name, 
        addresss,
        plan
    )
VALUES 
    (
        :first_name, 
        :last_name, 
        :addresss,
        :plan
    )

所以我想说如果已经有一行WHERE last_name = :last_name AND plan = :plan,然后更新它,否则,添加一个新行。

我可以通过多个查询来做到这一点,但我只是想看看是否有一种方法可以用一个镜头来做到这一点,而无需来回使用它。这将在一个循环中完成,因此如果我必须在多个查询中执行此操作,它可能会使查询数量增加一倍。

【问题讨论】:

标签: php mysql pdo insert


【解决方案1】:

只需在两列上定义一个唯一索引:

create unique index videos_lastname_plan on videos(lastname, plan);

文档明确指出:

如果您指定 ON DUPLICATE KEY UPDATE,并插入一行 将导致 UNIQUE 索引或 PRIMARY KEY、MySQL 中的重复值 对旧行执行 UPDATE。

因此,两个 clumns 上的唯一索引非常好。声明是:

INSERT INTO videos (first_name, last_name, addresss, plan)
    VALUES (:first_name, :last_name, :addresss, :plan)
    on duplicate key update address = VALUES(address), first_name = VALUES(first_name);

【讨论】:

  • 明白了。在最后一行,应该是 first_name 而不是 plan,对吧?因为计划是唯一索引的一部分。
  • @zen 。 . .是的。我在想前两个是唯一的关键。固定。
  • 如果我有一个自动递增的 PRIMARY 列作为 ID。所以本质上是一个 PRIMARY AI 和我们创建的唯一索引。 ON DUPLICATE KEY UPDATE 会以任何方式受 PRIMARY id 的影响吗?我假设因为它的自动递增它应该忽略它?
  • @zen 。 . . on duplicate update 检查所有唯一键,包括主键。但是,自动递增键永远不会导致问题。换句话说,它已被检查,但不会成为问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2019-10-17
  • 2012-12-13
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多