【问题标题】:Inserting unique rows without updating old ones插入唯一行而不更新旧行
【发布时间】:2012-07-23 13:32:28
【问题描述】:

我在不同的数据库中有两个相似的表,我想从另一个插入一个。同时我想确保每次 mySql 遇到“重复 id”错误时,它都会在新表的底部插入行并分配一个新的唯一 id。我已经尝试过:
INSERT...SELECT...ON DUPLICATE KEY UPDATE
但是如果它找到“重复键”而不是更新前一行,我找不到让它插入新行的方法。

【问题讨论】:

  • “键”是自增值吗?如果是这样,我可能会为您提供解决方案。试试 'INSERT INTO table2 SELECT NULL, col1, col2, col3 FROM table1' 我手头没有确切的语法,但它应该可以这样工作。
  • 是的,“键”是一个自动增量字段。谢谢,我试试这个。
  • 不客气。很高兴听到你让它工作:)
  • @ATaylor 我试过你的代码......它工作了:D 我认为你应该看看 eggyal 想出了什么#cleanCode。谢谢!
  • 很高兴听到这个消息。我也将其作为常规答案发布,但当然 eggyval 的答案要好得多。您可能想给他“正确答案”的状态。 ;)

标签: mysql insert insert-select


【解决方案1】:

如果您可以为复制到目标表的每条记录分配新的id,无论源表中的id 是否以前存在于目标表中,您都可以不提供id 和允许 MySQL 使用默认的 NULL 值,该值会导致分配 auto_increment 值:

INSERT INTO destdb.tbl (colA, colB, colC)
SELECT colA, colB, colC
FROM   srcdb.tbl

否则,您将需要使用 NULLIF() 之类的东西将 id 显式设置为 NULL,基于​​在 SELECT 中将表连接在一起:

INSERT INTO destdb.tbl (id, colA, colB, colC)
SELECT NULLIF(src.id, dst.id), src.colA, src.colB, src.colC
FROM   srcdb.tbl src LEFT JOIN destdb.tbl dst USING (id)

【讨论】:

  • 嗯,我不知道 NULLIF。如果我需要这样的东西,我会尽量记住它。 +1
  • @ATaylor:MySQL 中隐藏了很多方便的函数;在火车上无聊时,花一个小时浏览手册页是非常值得的。救了我这么多痛苦! :)
  • 是的,我明白你的意思 :) 不幸的是,可以上网的“火车游乐设施”对我来说非常罕见:D
【解决方案2】:

根据http://dev.mysql.com/doc/refman/5.1/de/insert-select.html 的文档,这可以通过以下查询来实现:

INSERT INTO `table2` SELECT (NULL, col1, col2, col3) FROM `table1`

这样,自动增量值将保留为“NULL”,从而导致引擎为其提供新的 AI 值,而不是尝试将现有的值强制其中。

请不要因为语法问题向我扔石头,我还没有测试过。

【讨论】:

    【解决方案3】:
    If the id is autoincrement:
    Create an additional column in the second table with a reference to the id value in the first table
    Sample Select Query: 
    
    SELECT unique_id, data FROM table_1 WHERE id='$id'
    
    Sample Insert Query: 
    
    INSERT INTO table_2 (table_1_unique_id, data) VALUES ($unique_id_from_first_table, $data)
    
    This will solve any duplicate id problems and allow referencing between the two tables
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多