【问题标题】:mysql insert if value not exist in another table如果值不存在于另一个表中,则mysql插入
【发布时间】:2012-09-17 11:15:07
【问题描述】:

我有两个表将值存储为VARCHAR
我正在填充表,如果其他表中不存在值,我只想在其中一个表中插入值。
类似的东西:

INSERT IF IS EMPTY(SELECT * FROM t1 where v='test') INTO t2 (v) VALUES ('test')

我该怎么做?

【问题讨论】:

    标签: mysql insert exists


    【解决方案1】:

    您需要使用某种类型的INSERT...SELECT 查询。

    更新(澄清后):例如,如果t1中不存在相应的行,则以下是如何在t2中插入一行:

    INSERT INTO t2 (v)
      SELECT temp.candidate
      FROM (SELECT 'test' AS candidate) temp
      LEFT JOIN t1 ON t1.v = temp.candidate
      WHERE t1.v IS NULL
    

    用同一个查询插入多行,恐怕没有比这更好的了

    INSERT INTO t2 (v)
      SELECT temp.candidate
      FROM (
          SELECT 'test1' AS candidate
          UNION SELECT 'test2'
          UNION SELECT 'test3' -- etc
      ) temp
      LEFT JOIN t1 ON t1.v = temp.candidate
      WHERE t1.v IS NULL
    

    原答案

    例如,这将从table1 中满足WHERE 子句的所有行中提取other_column,并将行插入table2,并将值用作column_name。它将忽略重复的键错误。

    INSERT IGNORE INTO table2 (column_name)
      SELECT table1.other_column
      FROM table1 WHERE table1.something == 'filter';
    

    【讨论】:

    • 但这会插入 table2 并从 table1 获取值!如果 table1 中不存在该值,我想插入!请查看我对问题的编辑,谢谢
    • @4r1y4n: 如果值在 table1 中不存在,因为你这么说,并且它在 table2 中不存在,因为我们试图将它插入那里,那么 在哪里 i> 它存在吗?
    • 在 SQL 查询本身中(请参阅我的 psudo 查询 - 'test' 是值)!我只想在其中一个表中插入值,而不是两个表(t1 XOR t2)
    • 从 MySQL 8.0.19 开始,您不需要临时表来定义数据,而是使用 VALUE (dev.mysql.com/doc/refman/8.0/en/values.html)。
    • 实用说明:这可以很好地插入少量值。但是,当插入几百个值并对照几个 100k 现有值进行检查时,200x250.000 JOIN 会使查询变得非常缓慢。
    【解决方案2】:

    对于多列的插入,你可以试试这个。

    INSERT INTO table_1 (column_id,column_2,column_3,column_4,column_5)
     SELECT
        table_2.*
    FROM
        table_2
    LEFT JOIN table_1 ON table_1.column_id = table_2.column_id
    WHERE
        table_1.column_id IS NULL;
    

    【讨论】:

      【解决方案3】:
      INSERT IGNORE INTO table_1(col1,col2,col3,col4)
        SELECT table_2.*
        FROM table_2;
      

      上面的语句在你的场景中做得很好。

      1. 第 1 行:说明您希望将数据复制到的表,同时忽略任何键约束。
      2. 第 2 行:选择数据应来自的表和列
      3. 第 3 行:说明要从中复制数据的表

      【讨论】:

        【解决方案4】:
        $result = mysql_query("SELECT * FROM t1 WHERE v='test'");
        if(mysql_num_rows($result) == 0){
            mysql_query("INSERT INTO t2 (v) VALUES ('test')");
        }
        

        已经有一段时间没有使用mysql了,所以这些功能已被弃用,但我应该这样做。

        【讨论】:

        • 这是 PHP 而不是纯 MySQL!当然这可行,但我想使用 MySQL 查询来做到这一点
        • 好的,我最后一句话的意思是使用 PDO 或 MySQLi 会更好。我知道我没有得到你的问题,很遗憾我不知道答案。对不起!
        【解决方案5】:

        有点像贫民区.. 但有效。假设您将静态值插入到 'col'

        INSERT INTO t1 (col)
        SELECT 'test' 
          FROM t2
         WHERE (SELECT count(*) FROM t2 WHERE v='test') = 0;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-09
          • 2014-04-14
          • 1970-01-01
          • 2021-11-23
          • 2018-04-10
          相关资源
          最近更新 更多