【问题标题】:SQL: insert only new recordsSQL:只插入新记录
【发布时间】:2014-10-10 15:47:09
【问题描述】:

这一定很琐碎,但我似乎找不到解决方案。

我使用两个表,都没有任何主键。

我只想将第一个表的所有记录添加到第二个表中,前提是它们不存在。

基本上:

INSERT INTO Table2
SELECT Table1.*
FROM Table
WHERE "the record to be added doesn't already exists in Table2"

【问题讨论】:

  • 所以在两个表中的所有字段上放置一个唯一索引。在没有 where 子句的情况下进行查询 - 索引将拒绝任何会导致 table2 中重复键违规的 table1 记录
  • 先选择Table1中ID在Table2中不存在的行(带有EXISTS IN或Join),然后插入到table2中
  • @MarcB 问题是我无法控制第一张桌子。 Panagiotis 没有 ID 字段。
  • 这两个表是链接 ODBC 表还是其中一个表是本机 Access 表?如果是后者,您要插入哪个表?另外,MySQL是否真的参与其中? (您最近的问题是关于 ODBC 与 Oracle 的连接。)
  • 我只能从专用计算机连接到 ODBC 表。然后,我使用 ODBC 表中的记录更新本机 Access 表,以便我可以从未连接到 ODBC 表的计算机上处​​理它。涉及 SQL 是因为我无法使用 Access 连接到 ODBC 表,因为字段名称包含“/”,所以我必须使用直通 SQL 查询。我不知道这是否有任何帮助......

标签: mysql sql ms-access-2007


【解决方案1】:

你可以做这样的事情。您需要检查每个相关列 - 我刚刚以 2 为例。使用Not Exists 子句,您可以检查一条记录是否已经存在于多个列中。使用NOT IN,您将只能检查某列是否已存在记录。

INSERT INTO Table2
SELECT t1.*
FROM Table1 t1
WHERE NOT EXISTS 
(
      SELECT 1 
      FROM table2 t2 WHERE 
      t2.col1 = t1.col1 AND 
      t2.col2 = t1.col2
) 

【讨论】:

  • 有没有办法不手动检查所有列,因为我希望所有列都成为标准?
  • @Leo 不幸的是没有。如果您想确保没有插入重复数据 - 您需要检查所有相关字段。
  • 请问1后面的SELECT是什么意思?
  • @Leo EXISTS 子句正在检查记录的存在 - 而不是特定的值。在 SELECT 中返回 SELECT 1 比通过 SELECT * 返回整行更有效。
  • 我按照你说的做了,但是请求非常慢(大约 14000 行和 7 个字段)。我做错了吗?
【解决方案2】:

您可以使用EXISTS 函数:

INSERT INTO Table2
SELECT Table1.*
FROM Table1
WHERE NOT EXISTS(SELECT * FROM table2 WHERE <your expression to compare the two tables goes here>)

但我建议您检查表的唯一索引的使用情况

【讨论】:

    【解决方案3】:

    只是一个想法 - 未经测试:

    INSERT INTO Table2
    SELECT *
    FROM Table1
    WHERE NOT EXISTS(SELECT * FROM Table2 WHERE Table2.Field1 = Table1.Field1 AND Table2.Field2 = Table1.Field2)
    

    您必须在 NOT EXISTS 查询的 WHERE 子句中添加两个表的每个字段

    【讨论】:

      【解决方案4】:
      INSERT INTO X.TableX1
       (ColumX1,ColumnX2)
       
      SELECT DISTINCT c.[ColumnY1],c.[ColumnY2] 
       FROM Y.Table2 c INNER JOIN Database.z.Table3 i ON c.ColumnX1= i.ColumnY1 
      
      WHERE NOT EXISTS 
      (
            SELECT *
            FROM X.TableX1 WHERE 
            X.TableX1.ColumnX1=c.ColumnY1
      ) 
      

      这是连接两个表并过滤所需的数据并在每次运行时仅将新值更新到第三个表

      【讨论】:

        猜你喜欢
        • 2015-10-13
        • 2015-12-17
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-14
        相关资源
        最近更新 更多