复制同一MySQL表中的记录具有重复的密钥条目

时间:2012-11-29 12:54:48

标签: mysql sql insert

有没有办法使用类似于以下内容的MySQL INSERT

INSERT INTO doc_details SELECT * FROM doc_details WHERE dd_id = 1

这不起作用,因为主键正在重复,并且可能会非常冗长地扩展列。

这样做的目的是复制同一个表中的行,这些行将在以后修改,检索新记录的last_insert_id。因此,对其他方法的想法也将受到赞赏。

感谢。

4 个答案:

答案 0 :(得分:1)

只需为要复制的列命名并省略主键:

INSERT INTO doc_details (col1, col2, col3)
SELECT col1, col2, col3 
FROM doc_details 
WHERE dd_id = 1

答案 1 :(得分:0)

我建议您使用AUTO_INCREMENT选项创建ID字段,然后在插入时使用NULL值 -

INSERT INTO doc_details(id, column1, column2)
  SELECT NULL, column1, column2 FROM doc_details WHERE dd_id = 1;

在这种情况下,旧的ID将更改为新的。{/ p>

答案 2 :(得分:0)

您可以依赖临时表从旧记录中复制并省略键字段值 您必须使用至少一个命名列(即键字段名称)来省略其重复值。

请参阅以下示例:

CREATE TEMPORARY TABLE tmp SELECT * from doc_details WHERE dd_id = ?;
ALTER TABLE tmp drop pk_field_name_here; -- drop the key field for not repeating

INSERT INTO doc_details SELECT 0, tmp.* FROM tmp;
DROP TABLE tmp;

您可以观察到没有使用其他字段名称,但使用关键字段名称来省略它的值。

您还可以在Mysql: Copy row but with new id找到我对类似帖子的回答。

答案 3 :(得分:0)

感谢您的回答。非常感谢。由于大多数答案都指定了该列,因此这导致了一些额外的研究表明'通配符不能用于INSERT语句。 Select, Modify and insert into the same table

我设法在我的应用程序中使用单独的SELECT然后使用Perl INSERT函数扩展了列的map来解决此问题:

SELECT * FROM doc_details WHERE dd_id = 1

然后在Perl中,将行作为$ data中的哈希引用:

$data->{'dd_id'} = 0;
$columns = join(',', map {$_ .'='. $dbh->quote( $data->{$_} ) } keys %{$cdh} );

诀窍很好 - 只要维护auto_increment列,它就会复制行而不管列结构/顺序的变化。

我知道它不是一个纯粹的SQL解决方案 - 尽管Ravinder提供的是一个。

感谢所有人!