0

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

INSERT INTO doc_details SELECT * FROM doc_details WHERE dd_id = 1

这不起作用,因为主键被重复,并且它可能会变得非常冗长,扩展列。

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

谢谢。

4

4 回答 4

1

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

INSERT INTO doc_details (col1, col2, col3)
SELECT col1, col2, col3 
FROM doc_details 
WHERE dd_id = 1
于 2012-11-29T13:09:37.393 回答
0

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

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

在这种情况下,旧的ID将被新的更改。

于 2012-11-29T13:08:31.777 回答
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

于 2012-11-29T14:19:05.847 回答
0

感谢您的回答。非常感谢。因为大多数答案都指定了该列,这导致了一些额外的研究,即“不能在INSERT语句中使用通配符”。选择、修改和插入到同一个表中

我设法在我的应用程序中解决了这个问题,SELECT然后INSERT使用 Perlmap函数扩展列:

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 提供了一个。

谢谢大家!

于 2012-12-05T11:14:07.963 回答