有没有办法使用INSERT
类似于以下的 MySQL:
INSERT INTO doc_details SELECT * FROM doc_details WHERE dd_id = 1
这不起作用,因为主键被重复,并且它可能会变得非常冗长,扩展列。
这样做的目的是复制同一个表中的行,这些行稍后将被修改,检索last_insert_id
新记录。因此,其他方法的想法也会受到赞赏。
谢谢。
只需命名要复制的列并省略主键:
INSERT INTO doc_details (col1, col2, col3)
SELECT col1, col2, col3
FROM doc_details
WHERE dd_id = 1
我建议您ID
使用 AUTO_INCREMENT 选项创建字段,然后在插入时使用 NULL 值 -
INSERT INTO doc_details(id, column1, column2)
SELECT NULL, column1, column2 FROM doc_details WHERE dd_id = 1;
在这种情况下,旧的ID
将被新的更改。
您可以依赖临时表从旧记录中复制并省略关键字段值。
您必须至少使用一个命名列,即关键字段名称,以省略其重复值。
请参见以下示例:
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。
感谢您的回答。非常感谢。因为大多数答案都指定了该列,这导致了一些额外的研究,即“不能在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 提供了一个。
谢谢大家!