在MySQL中,我试图复制一行自增量列ID=1,并将数据插入到相同的表中,作为列ID=2的新行。
如何在单个查询中做到这一点?
在MySQL中,我试图复制一行自增量列ID=1,并将数据插入到相同的表中,作为列ID=2的新行。
如何在单个查询中做到这一点?
当前回答
假设表是user(id, user_name, user_email)。
你可以使用这个查询:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
其他回答
我倾向于使用mu太短的变体:
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
只要表具有相同的字段(除了日志表上的自动增量),那么这就可以很好地工作。
由于我尽可能使用存储过程(以使不太熟悉数据库的其他程序员的工作更轻松),这解决了每次向表中添加新字段时都必须返回并更新过程的问题。
它还确保如果您向表中添加了新字段,它们将立即开始出现在日志表中,而无需更新数据库查询(当然,除非您有一些显式设置字段的数据库查询)。
警告:您需要确保同时向两个表添加任何新字段,以便字段顺序保持相同…否则你就会开始出现奇怪的bug。如果你是唯一一个编写数据库接口的人,并且你非常小心,那么这工作得很好。否则,请坚持为所有字段命名。
注意:转念一想,除非你在做一个单独的项目,而且你确定不会有其他人在做,否则坚持显式列出所有字段名,并在模式更改时更新日志语句。这条捷径可能不值得它带来的长期头痛……特别是在生产系统上。
我正在寻找相同的功能,但我不使用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);
转储您想要sql的行,然后使用生成的sql,减去ID列,将其导入。
如果你能使用MySQL Workbench,你可以通过右键单击行并选择“复制行”,然后右键单击空行并选择“粘贴行”,然后更改ID,然后单击“应用”来做到这一点。
复制行:
将复制的行粘贴到空白行:
更改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