在MySQL中,我试图复制一行自增量列ID=1,并将数据插入到相同的表中,作为列ID=2的新行。
如何在单个查询中做到这一点?
在MySQL中,我试图复制一行自增量列ID=1,并将数据插入到相同的表中,作为列ID=2的新行。
如何在单个查询中做到这一点?
当前回答
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
其他回答
对于一个快速,干净的解决方案,不需要你命名列,你可以使用一个准备好的语句,如下所示: 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
免责声明:此解决方案仅适用于经常在许多表中重复复制行的人。它在流氓用户手中可能会很危险。
在我看来,最好的方法似乎是只使用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中。
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
我正在寻找相同的功能,但我不使用MySQL。我想复制所有的字段,当然除了主键(id)。这是一次性查询,不能在任何脚本或代码中使用。
我找到了PL/SQL的方法,但我相信任何其他SQL IDE都可以做到。我做了一个基本的
SELECT *
FROM mytable
WHERE id=42;
然后将其导出到一个SQL文件,在那里我可以找到
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (1, 2, 3, ..., 42);
我只是编辑并使用它:
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (mysequence.nextval, 2, 3, ..., 42);
假设表是user(id, user_name, user_email)。
你可以使用这个查询:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)