【问题标题】:Adding Inner join and where clause to INSERT INTO ON DUPLICATE KEY UPDATE将 Inner join 和 where 子句添加到 INSERT INTO ON DUPLICATE KEY UPDATE
【发布时间】:2016-07-05 10:38:19
【问题描述】:

我从这个 INSERT INTO ON DUPLICATE KEY UPDATE MySQL 语句开始。

INSERT INTO Table1 ( field1, field2)
VALUES (1, 2)
ON DUPLICATE KEY UPDATE field1 = 1, field2 = 2

然后,我遇到了一个错误“外键约束失败”。

我意识到我需要添加另一个 WHERE 子句条件来满足具有内连接的外键约束。

我尝试过这样的事情;

INSERT INTO Table1 ( field1, field2)
Inner Join Table2
ON Table2.id = Table1.field_id
VALUES (1, 2)
ON DUPLICATE KEY UPDATE field1 = 1, field2 = 2
WHERE Table2.addr='123456'

我收到语法错误。编写此 MySQL 语句的正确方法是什么?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    我不确定你到底想做什么。但是,您可以将任何select 语句放在insert . . . select 语句中,并且仍然使用on duplicate key update。例如:

    insert into Table1(field1, field2)
        select 1, 2
        from table1 t1 join
             table2 t2
             on t2.id = t1.field_id
        where t2.addr = '123456'
        on duplicate key update field1 = 1, field2 = 2;
    

    【讨论】:

    • 您的第二行 select 1, 2 似乎不对。 1,2 不应该是列的名称而不是列的值吗?
    • 我用另一种方式问了这个问题。 stackoverflow.com/questions/38202016/…
    • @LitAiy 。 . . “1”和“2”取自问题。
    【解决方案2】:

    由于您遇到了外键约束,因此您必须解决问题才能使 INSERT 正常工作。

    您的查询应该类似于:

    INSERT INTO Table1 ( field1, field2, foreign_key_id)
    Select (1, 2, foreign_key_id)
    where 
    ...
    ON DUPLICATE KEY UPDATE field1 = 1, field2 = 2
    

    我相信阅读此问题的答案将解决您的问题。 Mysql: How to insert values in a table which has a foreign key

    【讨论】:

      【解决方案3】:
         Declare
              @Field1 VARCHAR(255),  
              @Field2 VARCHAR(255)
      
         SET @Field1= 'Test'
         SET @Field2='ABC'
      
          IF EXISTS (SELECT * FROM ##Table1 WHERE ##Table1.Field1=@Field1 AND ##Table1.Field2=@Field2)
      
              BEGIN
                  UPDATE ##Table1 SET Field1=@Field1,Field2=@Field2
              END 
              ELSE
              BEGIN
                      INSERT INTO ##Table1 VALUES(@Field1,@Field2)
              END
      
          SELECT * FROM ##Table1  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2016-10-29
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多