【发布时间】:2012-02-27 16:55:42
【问题描述】:
在 MySQL 中,我尝试使用 autoincrement column ID=1 复制一行并将数据insert 复制到同一个表中,作为带有 column ID=2 的新行。
如何在单个查询中执行此操作?
【问题讨论】:
在 MySQL 中,我尝试使用 autoincrement column ID=1 复制一行并将数据insert 复制到同一个表中,作为带有 column ID=2 的新行。
如何在单个查询中执行此操作?
【问题讨论】:
使用INSERT ... SELECT:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
其中c1, c2, ... 是除id 之外的所有列。如果您想使用 2 的 id 显式插入,则将其包含在您的 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=0; /* Update other values at will. */
INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;
另见av8n.com - How to Clone an SQL Record
好处:
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);
SET id = 0 - 来自Trig's comment on this answer。
说桌子是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
免责声明:此解决方案仅适用于经常在许多表中重复复制行的人。在流氓用户手中可能很危险。
【讨论】:
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
【讨论】:
这里有很多很棒的答案。下面是我为正在开发的 Web 应用程序完成此任务而编写的存储过程示例:
-- 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
【讨论】:
您也可以传入'0'作为列的值以自动递增,创建记录时将使用正确的值。这比临时表要容易得多。
来源: Copying rows in MySQL (参见 TRiG 对 Lore 的第一个解决方案的第二条评论)
【讨论】:
我倾向于使用 mu is too short 张贴的变体:
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
只要表具有相同的字段(日志表上的自动增量除外),就可以很好地工作。
由于我尽可能使用存储过程(以使其他不太熟悉数据库的程序员的生活更轻松),这解决了每次向表中添加新字段时都必须返回并更新过程的问题.
它还确保如果您向表中添加新字段,它们将立即开始出现在日志表中,而无需更新您的数据库查询(当然,除非您有一些明确设置字段)
警告:您需要确保同时向两个表中添加任何新字段,以便字段顺序保持不变...否则您将开始遇到奇怪的错误。如果你是唯一一个编写数据库接口的人并且你非常小心,那么这很好用。否则,请坚持命名所有字段。
注意:再想一想,除非您正在处理一个单独的项目,否则您确定不会让其他人在此工作坚持明确列出所有字段名称并将您的日志语句更新为您的架构更改。这条捷径可能不值得它引起的长期头痛……尤其是在生产系统上。
【讨论】:
【讨论】:
试试这个:
INSERT INTO test_table (SELECT null,txt FROM test_table)
每次您运行此查询时,都会使用新的 ID 再次插入所有行。表中的值并将成倍增加。
我使用了一个包含两列的表格,即 id 和 txt,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);
【讨论】:
insert into your_table(col1,col2,col3) select col1+1,col2,col3 from your_table where col1=1;
注意:如果 col1 是主键,请确保增加后 col1 的新值不是重复条目。
【讨论】:
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 ;
【讨论】:
转储你想要 sql 的行,然后使用生成的 SQL,减去 ID 列重新导入。
【讨论】: