【问题标题】:mysql insert if row does not exist already in a table with NO UNIQUE FIELDS如果没有唯一字段的表中不存在行,则mysql插入
【发布时间】:2010-12-30 11:02:05
【问题描述】:

现在已经在寻找如何实现这一点。

似乎所有解决方案都需要具有索引的唯一字段。

【问题讨论】:

  • 如果没有唯一字段,我认为这行不通...我的意思是,你想使用什么条件?
  • Glenn,没有唯一索引就无法判断是否存在需要更新的重复列。向我们展示您的表结构并告诉我们您要触发 UPDATE 子句的字段,我们可以给您答案。

标签: mysql insert conditional not-exists


【解决方案1】:

您是否已经考虑过 mysql 的 INSERT OR UPDATE 语法,或者您是否希望“取消”最新插入而不是恢复为更新?

编辑:经过反思,ON DUPLICATE KEY 的确切语法(如 afftee 所示)仅由主键或至少唯一列上的重复值触发。

一种可能的解决方案是使用类似于此的BEFORE INSERT 触发器:

CREATE TRIGGER block_dup_insert BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
  -- check condition and stop if it would be duplicated according to your logic
END

如果您想停止触发器并阻止实际插入,您似乎可以使用 [mysql doc][1] 上的 Nicolas Lescure 的这篇文章:

“停止操作”的另一种方法是 只需创建一个表(stop_action) 一个主键(reason_to_stop)。然后 你用一些文字预先填写这张表 ('不要那样做','或者那样做')=> 要停止动作,只需插入 此表 (stop_action) 与任何 预填充的值('不要做 那个')。

[1]:http://dev.mysql.com/doc/refman/5.1/en/create-trigger.htmlmysql 创建触发器文档

【讨论】:

    【解决方案2】:

    INSERT 中没有 IF NOT EXISTS 语法,但您可以使用 在重复密钥机制上。假设您在 名字,姓氏,您的更新可能是:

    INSERT INTO tb (firstname, lastname) 
    VALUES ('Jack', 'Doe') 
    ON DUPLICATE KEY UPDATE lastname = lastname;
    

    使插入中立。

    【讨论】:

    • 几个小时的搜索......你让我很开心:)
    【解决方案3】:

    Mysql 插入文档中没有“如果不存在则插入”语法。 为了解决这个问题,我预先准备好使用“Insert ... select”语法。在选择部分,您必须使用“不存在”语法添加 where 语句。 例如,您可以这样使用:

        insert into tbl (firstname,lastname) select 'Jhon', 'Doe'
    from tbl where not exists (select 1 from tbl where firstname = 'Jhon' and lastname = 'Doe') limit 1;
    

    【讨论】:

    • 不起作用,因为如果该行不存在,那么您将不会从 tbl 中选择“Jhon”、“Doe”获得任何结果,因此如果该行将不会插入任何行不存在
    【解决方案4】:
    $sql2="INSERT INTO site_shipping (ship_oid,ship_status)
             SELECT '$orderid', '$status'
             FROM site_shipping 
             WHERE NOT EXISTS 
              (SELECT * 
               FROM site_shipping 
               WHERE ship_oid = '$orderid'
              )
             LIMIT 1
          ";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-05
      • 2014-04-14
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多