在MySQL中,我试图复制一行自增量列ID=1,并将数据插入到相同的表中,作为列ID=2的新行。

如何在单个查询中做到这一点?


当前回答

这有助于,它支持BLOB/TEXT列。

CREATE TEMPORARY TABLE temp_table
AS
SELECT * FROM source_table WHERE id=2;
UPDATE temp_table SET id=NULL WHERE id=2;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;
USE source_table;

其他回答

CREATE TEMPORARY  TABLE IF NOT EXISTS  `temp_table` LIKE source_table;
DELETE FROM `purchasing2` ;
INSERT INTO temp_table SELECT * FROM source_table where columnid = 2;
ALTER TABLE temp_table MODIFY id INT NOT NULL;
ALTER TABLE temp_table DROP PRIMARY KEY;
UPDATE temp_table SET id=NULL ;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY  TABLE IF EXISTS  temp_table ; 

您还可以传入'0'作为列的值来自动递增,在创建记录时将使用正确的值。这比临时表简单多了。

来源: 复制MySQL中的行 (见TRiG对第一个解的评论,Lore)

假设表是user(id, user_name, user_email)。

你可以使用这个查询:

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)

使用INSERT…选择:

insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1

其中c1, c2,…是除id之外的所有列。如果你想显式地插入id为2,那么在你的insert列列表和SELECT中包含它:

insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1

当然,在第二种情况下,您必须注意可能重复的id 2。

在我看来,最好的方法似乎是只使用sql语句复制该行,同时只引用必须和想要更改的列。

CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY

SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=0; /* Update other values at will. */

INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;

参见av8n.com -如何克隆SQL记录

好处:

SQL语句2只提到在克隆过程中需要更改的字段。他们不了解或不关心其他领域。其他字段只是随大流,没有变化。这使得SQL语句更易于编写、阅读、维护和扩展。 只使用普通的MySQL语句。不需要其他工具或编程语言。 在一次原子操作中将完全正确的记录插入到your_table中。