在MySQL中,我试图复制一行自增量列ID=1,并将数据插入到相同的表中,作为列ID=2的新行。
如何在单个查询中做到这一点?
在MySQL中,我试图复制一行自增量列ID=1,并将数据插入到相同的表中,作为列ID=2的新行。
如何在单个查询中做到这一点?
当前回答
如果你能使用MySQL Workbench,你可以通过右键单击行并选择“复制行”,然后右键单击空行并选择“粘贴行”,然后更改ID,然后单击“应用”来做到这一点。
复制行:
将复制的行粘贴到空白行:
更改ID:
应用:
其他回答
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
使用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。
对于一个快速,干净的解决方案,不需要你命名列,你可以使用一个准备好的语句,如下所示: https://stackoverflow.com/a/23964285/292677
如果你需要一个复杂的解决方案,你可以经常这样做,你可以使用这个过程:
DELIMITER $$
CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text)
SQL SECURITY INVOKER
BEGIN
SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns;
SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns
WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns;
SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')',
'SELECT ', @columns,
' FROM ', _schemaName, '.', _tableName, ' ', _whereClause);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
END
你可以用:
CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
例子
duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column
duplicateRows('acl', 'users'); -- will duplicate all records in the 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 ;
INSERT INTO `dbMyDataBase`.`tblMyTable` ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) SELECT NULL, `Column2`, `Column3`, 'CustomValue' AS Column4 FROM `dbMyDataBase`.`tblMyTable` WHERE `tblMyTable`.`Column2` = 'UniqueValueOfTheKey' ; /* mySQL 5.6 */