SQL 查询表中的更新行并将其插入为新行

Posted

技术标签:

【中文标题】SQL 查询表中的更新行并将其插入为新行【英文标题】:SQL query for update rows in a table and insert those as new rows 【发布时间】:2020-07-26 05:26:55 【问题描述】:

这是想要实现的:-

从表 t 中获取一些行 (x)。 在所有这些 x 行中更改一个 col 值 (f)。 然后将这些 x 作为新行插入到同一个表 t 中。

此过程不适用于此错误:-

您不能在 FROM 子句中指定目标表 't' 进行更新

这是我的程序

DELIMITER //
DROP procedure IF EXISTS copy_values //
CREATE PROCEDURE copy_values(
IN source_id char(36), 
IN dest_id char(36))
BEGIN
INSERT INTO t (a, b, c, d, e, f)
VALUES (
    (SELECT a FROM t WHERE t_cid=source_id), 
    (SELECT b FROM t WHERE t_cid=source_id), 
    (SELECT c FROM t WHERE t_cid=source_id), 
    (SELECT d FROM t WHERE t_cid=source_id), 
    (SELECT e FROM t WHERE t_cid=source_id), 
    dest_id
    );
END //
DELIMITER ;

您能否建议一个替代查询来解决此用例?

【问题讨论】:

查看meta.***.com/questions/333952/…,并考虑您是否真的需要一个程序。 【参考方案1】:

INSERT ... SELECT ... 应该可以工作。

...
INSERT INTO t
            (a,
             ...
             e,
             f)
            SELECT a,
                   ...
                   e,
                   dest_id
                   FROM t
                   WHERE t_cid = source_id;
...

【讨论】:

此查询无法解决用例。在我的情况下,表 t 中不存在 dest_id。它是一些常量值,例如“213”,必须将所有行的 f 列放入。 (a,b,c,d,e) 我们从 t 中挑选,但是 col f 的值我们是硬编码的 @ShivanshRajolia-HeLleR:是的,我看到它是过程的参数。但是您可以在查询中使用常量(在查询的上下文中)。在特定情况下,如果没有同名的列,它应该绑定到参数。你试过了吗? 是的,我试过了。这没用。如果您直接想将一些行从一个表传输到另一个表,则 INSERT INTO SELECT 语句可以工作......无法处理常量+无法插入到您正在从中进行选择的同一个表中。这就是为什么我尝试 INSERT INTO VALUES SELECT 仍然收到提到的错误。我认为这里可能需要其他一些查询方法。也许插入不起作用。 @ShivanshRajolia-HeLleR:在这里完美运行:dbfiddle.uk/… 一定是你做错了什么。 @ShivanshRajolia-HeLleR 。 . .这回答了您在此处提出的问题(如 db fiddle 所示)。我认为你应该接受这个答案。如果您还有其他问题,请提出问题。

以上是关于SQL 查询表中的更新行并将其插入为新行的主要内容,如果未能解决你的问题,请参考以下文章

在循环中插入sql查询是好习惯还是坏习惯?

如何在 SQL Server 2005 中进行更新插入(更新或插入)

如何将 Update 语句添加到我将要插入到带有 MS SQL 查询的表中的选定行中?

sql查询不更新img文件路径

如何在一个查询中插入和更新

oracle触发器在表中插入新行时更新新的视图行