Answers:
用途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 的可能重复项。
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;
好处:
your_table
在一个原子操作中插入了完全正确的记录。Error Code: 1113. A table must have at least 1 column
。
SET id=NULL
可能会导致错误Column 'id' cannot be null
。应该替换为UPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
说桌子是user(id, user_name, user_email)
。
您可以使用以下查询:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Result: near "SELECT": syntax error
这有所帮助,它支持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 : //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
免责声明:此解决方案仅适用于经常在许多表中重复复制行的人。在流氓用户的手中这可能很危险。
您还可以输入“ 0”作为要自动增加的列的值,创建记录时将使用正确的值。这比临时表容易得多。
来源: 在MySQL中复制行 (请参阅TRiG的第二条评论到Lore的第一个解决方案)
这里有很多很好的答案。以下是为完成我正在开发的Web App的任务而编写的存储过程的示例:
-- 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
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);
我倾向于使用mu太短发布的变体:
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
只要这些表具有相同的字段(日志表上的自动增量除外),就可以很好地工作。
由于我尽可能使用存储过程(以简化对数据库不太熟悉的其他程序员的生活),因此解决了每次向表中添加新字段时都必须返回并更新过程的问题。
它还可以确保,如果您将新字段添加到表中,它们将立即开始出现在日志表中,而无需更新数据库查询(当然,除非您有一些字段明确地设置了该字段)
警告:您将要确保同时将所有新字段添加到两个表中,以使字段顺序保持不变...否则,您将开始遇到奇怪的错误。如果您是唯一编写数据库接口的人,并且非常小心,则效果很好。否则,请坚持命名所有字段。
注意:再三考虑一下,除非您正在开发一个单独的项目,否则您确定不会有其他项目在进行,而是坚持明确列出所有字段名称,并在架构更改时更新日志语句。这种捷径可能不值得它引起的长期头痛……尤其是在生产系统上。
插入dbMyDataBase.tblMyTable ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) 选择 空值, `Column2`, `Column3`, “ CustomValue” AS Column4 从`dbMyDataBase`.`tblMyTable` tblMyTable`.Column2 ='UniqueValueOfTheKey' ; / * mySQL 5.6 * /