【问题标题】:Update an insert query更新插入查询
【发布时间】:2017-04-23 16:29:20
【问题描述】:

我是 db 新手,所以我的问题可能是错误的。

我试图实现的是从表中获取行,编辑两列并插入到同一个表中。

INSERT INTO table_name 
    (SELECT * 
     FROM table_name 
     WHERE TRANSACTION_ID = 1 );

但在添加插入之前我想更新字段

UPDATE table_name 
SET UPDATED_DATE = '20161208', 
    STATUS = 'updated' 
WHERE TRANSACTION_ID = 1;

是否需要编写存储过程来实现这一点?

如果有,应该怎么做?

【问题讨论】:

  • 不需要存储过程。是否要将行添加到表中,然后执行INSERT INTO t SELECT c1, literals, etc FROM t。否则只需执行 UPDATE。

标签: sql database stored-procedures oracle11g oracle10g


【解决方案1】:

存储过程通常用于需要重复执行的 SQL 操作(可重用代码),并将动态值传递给它(如果需要)。

如果您只是希望为一次更新操作运行这 2 个查询,则不建议使用存储过程。您可以将这 2 个命令作为单个事务运行,并将事务作为单个原子事务提交。

【讨论】:

  • 但我想在插入之前更新两个字段。单笔交易能做到吗?或者它将获取 TRANSACTION_ID = 1 的所有条目并进行更新?
【解决方案2】:

您正在学习数据库。当您使用INSERT 时,您应该始终列出列,除非您确切知道自己在做什么。因此,列出显式列并输入您想要的值:

INSERT INTO table_name( . . ., UPDATED_DATE, STATUS)
    SELECT . . ., '20161208', 'updated'
    FROM table_name
    WHERE TRANSACTION_ID = 1;

您可以在单个语句中执行此操作。

【讨论】:

    【解决方案3】:

    你想要实现的是在你的表格中复制一行,并修改这个复制行的一些字段?

    如果是这样,你需要做这样的事情(不要把 TRANSACTION_ID 放在字段列表中。如果你有身份,通常它应该自动创建一个 ID_TRANSACTION 2):

    INSERT INTO TableName (field1, field2, ...)
    SELECT * FROM table_name WHERE TRANSACTION_ID = 1
    

    然后:

    UPDATE table_name SET UPDATED_DATE = '20161208', STATUS = 'updated' WHERE TRANSACTION_ID = 2;
    

    【讨论】:

    • 不需要额外的更新。只需在 INSERT 的 SELECT 列表中指定值。
    • @REK 你明白我想要做什么,但在我的情况下,TRANSACTION_ID 不是唯一的 id,我的表每个 TRANSACTION_ID 将有 2 个条目,当我复制时,它会再创建 2 个相同的条目TRANSACTION_ID。因此,我无法使用您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 2016-12-04
    • 2018-12-04
    • 2011-08-29
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多