mu *_*ort 318
用途INSERT ... SELECT
:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
Run Code Online (Sandbox Code Playgroud)
c1, c2, ...
除了之外的所有列在哪里id
.如果要显式插入id
2,则将其包含在INSERT列列表和SELECT中:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
Run Code Online (Sandbox Code Playgroud)
当然,你必须id
在第二种情况下处理2 的可能重复.
par*_*vus 46
IMO,最好似乎只使用sql语句来复制该行,同时只引用你必须想要改变的列.
CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY
SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=NULL; /* Update other values at will. */
INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;
Run Code Online (Sandbox Code Playgroud)
优点:
your_table
在一个原子操作中插入完全正确的记录.Vij*_*jay 16
说桌子是user(id, user_name, user_email)
.
您可以使用此查询:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Run Code Online (Sandbox Code Playgroud)
Pet*_*dík 10
这有帮助,它支持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;
Run Code Online (Sandbox Code Playgroud)
对于不需要命名列的快速,干净的解决方案,您可以使用如下所述的预准备语句: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
Run Code Online (Sandbox Code Playgroud)
你可以运行它:
CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
Run Code Online (Sandbox Code Playgroud)
例子
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
Run Code Online (Sandbox Code Playgroud)
免责声明:此解决方案仅适用于经常在多个表中重复复制行的人.在流氓用户手中可能是危险的.
如果您能够使用 MySQL Workbench,则可以通过右键单击该行并选择“复制行”,然后右键单击空行并选择“粘贴行”,然后更改 ID,然后执行此操作单击“应用”。
复制该行:
将复制的行粘贴到空白行中:
更改ID:
申请:
小智 5
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
Run Code Online (Sandbox Code Playgroud)