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
免责声明:此解决方案仅适用于经常在多个表中重复复制行的人 . 在流氓用户手中可能是危险的 .
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;
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;
11 回答
我倾向于使用mu过短的变体:
只要表具有相同的字段(除了日志表上的自动增量),这样就可以很好地工作 .
由于我尽可能使用存储过程(为了使其他不熟悉数据库的程序员的生活更轻松),这解决了每次向表中添加新字段时必须返回并更新过程的问题 .
它还确保如果向表中添加新字段,它们将立即开始出现在日志表中,而不必更新数据库查询(除非您有一些明确设置字段)
Warning: 您需要确保同时向两个表添加任何新字段,以便字段顺序保持不变...否则您将开始获得奇怪的错误 . 如果你是唯一一个编写数据库接口的人并且你非常小心,那么这很好用 . 否则,坚持命名所有字段 .
Note: 第二个想法,除非您正在开展一个您确定不会让其他人工作的独立项目,否则请明确列出所有字段名称,并在架构更改时更新日志语句 . 这条捷径可能不值得长期头痛......尤其是在 生产环境 系统上 .
我正在寻找相同的功能,但我不使用MySQL . 我想复制所有字段,当然除了主键(id) . 这是一次性查询,不能在任何脚本或代码中使用 .
我找到了PL / SQL的方法,但我确信任何其他SQL IDE都可以 . 我做了一个基本的
然后将其导出到我可以找到的SQL文件中
我刚编辑并使用它:
对于不需要您命名列的快速,干净的解决方案,您可以使用如下所述的预准备语句:https://stackoverflow.com/a/23964285/292677
如果您需要复杂的解决方案以便经常这样做,您可以使用以下过程:
你可以运行它:
例子
免责声明:此解决方案仅适用于经常在多个表中重复复制行的人 . 在流氓用户手中可能是危险的 .
IMO,最好似乎只使用sql语句来复制那一行,同时只引用你必须想要改变的列 .
另见av8n.com - How to Clone an SQL Record
优点:
SQL语句2仅提及克隆过程中需要更改的字段 . 他们不了解 - 或关心 - 其他领域 . 其他领域只是为了骑行,没有改变 . 这使得SQL语句更易于编写,更易于阅读,更易于维护和更具可扩展性 .
仅使用普通的MySQL语句 . 不需要其他工具或编程语言 .
在一个原子操作中,
your_table
中插入了完全正确的记录 .这有帮助,它支持BLOB / TEXT列 .
您还可以将“0”作为列的值传递给自动递增,创建记录时将使用正确的值 . 这比临时表简单得多 .
资料来源:Copying rows in MySQL(参见TRiG的第二条评论,由Lore提出的第一个解决方案)
转储您想要的行,然后使用生成的SQL,减去ID列,将其重新导入 .
使用
INSERT ... SELECT
:其中
c1, c2, ...
是除id
之外的所有列 . 如果要显式插入id
为2,则将其包含在INSERT列列表和SELECT中:当然,你必须在第二种情况下处理可能的重复
id
.说表是
user(id, user_name, user_email)
.您可以使用此查询: