我有一个表“test”,它具有自动递增的id和任意数量的列。 我想复制该表中的一行,当然除了id之外,所有列都相同。 有没有办法做到这一点,而不命名所有列? 我以为INSERT... SELECT... ON DUPLICATE KEY会对我有所帮助,直到我意识到它从来不生成INSERT ON DUPLICATE,它只是更新现有的行。
CREATE TEMPORARY TABLE tmp SELECT * from my_table WHERE ...;
ALTER TABLE tmp drop pk_id; # drop autoincrement field
# UPDATE tmp SET ...; # just needed to change other unique keys
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
DROP TEMPORARY TABLE tmp;
SET @table = 'the_table';
SELECT GROUP_CONCAT(IF(COLUMN_NAME IN ('id'), 0, CONCAT("\`", COLUMN_NAME, "\`"))) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @table INTO @columns;
SET @s = CONCAT('INSERT INTO ', @table, ' SELECT ', @columns,' FROM ', @table, ' WHERE id=1');
PREPARE stmt FROM @s;
EXECUTE stmt;
CREATE TEMPORARY TABLE tmp SELECT * FROM sitelog WHERE 1=1;
ALTER TABLE tmp DROP COLUMN `ID`;
INSERT INTO sitelog SELECT 0, tmp.* FROM tmp;
DROP TEMPORARY TABLE tmp;
7条答案
按热度按时间u0sqgete1#
假设您的表具有以下字段:
然后,要将值从一行复制到具有新键值的另一行,以下查询可能会有所帮助
这将为
pk_id
字段生成一个新值,并从所选行的col1
和col2
复制值。您可以扩展此示例以应用于表中的更多字段。
我们可以使用临时表先从主表缓冲,然后再用它复制到主表。仅仅更新临时表中的pk引用字段不会有帮助,因为它可能已经存在于主表中。相反,我们可以从临时表中删除pk字段,并将所有其他字段复制到主表中。
参考referred posting中Tim Ruehsen的回答:
falq053o2#
这适用于MySQL所有版本和Amazon RDS Aurora:
或
将索引列设置为NULL,然后执行INSERT。
但不是在MariaDB中,我测试了版本10。
r7xajy2e3#
这仅适用于复制一行
代码:
当然,您应该使用PDO:bindparam并检查变量是否受到攻击等,但给出了示例
如果您在处理
NULL
值时遇到问题,可以使用以下代码,以便仅针对其值不是NULL
的imploding
名称和值。wn9m85ua4#
ncecgwcz5#
根据列的数量,您可以只命名列,而不添加ID,然后手动添加一个ID,或者,如果表中有ID,则添加一个辅助ID(sid):
insert into PROG(date, level, Percent, sid) select date, level, Percent, 55 from PROG where sid = 31
此处,如果sid 31有多个结果行,则所有结果行都将被复制到sid 55,并且您的auto iD仍将自动生成。insert into PROG(date, level, Percent, ID) select date, level, Percent, 55 from PROG where ID = 31
,其中55是表中的下一个可用ID,ID 31是要复制的ID。xam8gpfp6#
我正在使用临时表:
0s0u357o7#