在MySQL中,我想复制一个具有自增列“ID=1”的行,并将数据作为新行插入到同一表中,其中“column ID=2”。如何在单个查询中完成此操作?
使用 INSERT ... SELECT
语句:
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;
优点:
your_table
中。SET id=NULL
可能会导致错误 Column 'id' cannot be null
。
应该替换为
UPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
- Modder假设表名为 user(id, user_name, user_email)
。
你可以使用以下查询语句:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
结果:附近有“SELECT”:语法错误
- kybERROR: 列"id"中的空值
。 - Arqam Rafay这很有用,它支持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;
如果你需要一个快速、干净的解决方案,并且不需要给列命名,你可以使用这里描述的预编译语句: https://dev59.com/GW855IYBdhLWcg3w_5qm#23964285
如果你需要一个复杂的解决方案,以便经常使用此功能,则可以使用以下过程:
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
免责声明:此解决方案仅适用于需要经常在多个表中重复复制行的用户。在不良用户手中可能会带来风险。
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
-- Create Temporary Table
SELECT * INTO #tempTable FROM <YourTable> WHERE Id = Id
--To trigger the auto increment
UPDATE #tempTable SET Id = NULL
--Update new data row in #tempTable here!
--Insert duplicate row with modified data back into your table
INSERT INTO <YourTable> SELECT * FROM #tempTable
-- Drop Temporary Table
DROP TABLE #tempTable