有没有办法使用类似于以下内容的MySQL INSERT
:
INSERT INTO doc_details SELECT * FROM doc_details WHERE dd_id = 1
这不起作用,因为主键正在重复,并且可能会非常冗长地扩展列。
这样做的目的是复制同一个表中的行,这些行将在以后修改,检索新记录的last_insert_id
。因此,对其他方法的想法也将受到赞赏。
感谢。
答案 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提供的是一个。
感谢所有人!