【问题标题】:How to check if a value exists in tableA before inserting in tableB?如何在插入表之前检查表中是否存在值?
【发布时间】:2015-12-17 07:06:13
【问题描述】:

我有这样的情况:

0 < $var < (SELECT col FROM tableA ORDER BY col DESC LIMIT 1)

我也有这样的INSERT 查询:

INSERT INTO tableB (col) VALUES (?) ON DUPLICATE KEY UPDATE col = VALUE(col)

现在我想知道,如何在 MySQL 中实现:

  • 如果上述条件成立,则插入新行,否则什么都不做或给我一个错误?

    if (condition == true) then insert into table
    

【问题讨论】:

  • 看起来像是 php 和 mysql 的融合。顺便说一句,您可以使用 max(id)。
  • ODKU 没有值包装器。您可以使用 insert ignore 而不使用 ODKU
  • @Drew 是的,我猜我应该使用MAX(),但老实说我不知道​​如何
  • 使用结果为 TRUE 或 FALSE 的子查询

标签: php mysql conditional-statements


【解决方案1】:

SELECT MAX(col) FROM tableA 为您提供表 tableAcol 列中的最大值。

我认为你要求做的是:

  • 如果$val(来自某个地方的值 - 可能是您的 PHP)大于 0 并且小于存储在表 tableA 中的最大值,则确保该值出现在表 tableB 中。李>

如果是这样,您也许可以使用:

INSERT INTO tableB(col)
    SELECT $val
      FROM dual
     WHERE $val > 0
       AND $val < (SELECT MAX(col) FROM tableA)
       AND NOT EXISTS(SELECT col FROM tableB WHERE col = $val)

您现在需要将其翻译成适当的 PHP。

(另见MySQL conditional insert。)


如何在查询中添加 ON DUPLICATE KEY?

您也可以删除AND NOT EXISTS(SELECT col FROM tableB WHERE col = $val),因为col 是唯一的,它可以防止插入重复。

您不需要 ON DUPLICATE,因为 NOT EXISTS 使其无关紧要。如果您不介意尝试重复插入导致的错误,则不需要任何这些:您只需执行INSERT INTO tablaB(col) VALUES(?)

AFAICS,ON DUPLICATE 子句执行无操作更新;这避免了这样做的需要。我想如果表上有触发器使得“最后修改”(时间或用户或两者)列将被更改,或者表的键不是col 专栏——不过,这些都是非常深奥的可能性。您可以通过显示指示此类功能的表格大纲模式来提供帮助。

如果您确实需要 ON DUPLICATE 子句,您可以尽可能阅读manual 并将其添加到 SELECT 之后。

INSERT INTO tableB(col)
    SELECT $val
      FROM dual
     WHERE $val > 0
       AND $val < (SELECT MAX(col) FROM tableA)
       AND NOT EXISTS(SELECT col FROM tableB WHERE col = $val)
    ON DUPLICATE KEY UPDATE col = VALUE(col)

(当然,如果你真的不想要 NOT EXISTS 子句,你可以删除它。)

【讨论】:

  • 很好的答案...谢谢。
  • 只有一件事:如何将ON DUPLICATE KEY 添加到我的查询中?
  • 你也可以删除这个AND NOT EXISTS(SELECT col FROM tableB WHERE col = $val),因为colunique,它可以防止插入重复。
  • 看,有一点对我来说很奇怪,为什么我的问题有一个标志 [unclear what you're ask] ?因为我认为我的问题很清楚。你知道为什么我的问题一票赞成吗?
  • 有人不喜欢它。别担心。 AFAIK,几天后,该标志将过期(除非其他脏话也参与其中)。
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多