【问题标题】:how to update data from a table to store results in another如何更新表中的数据以将结果存储在另一个表中
【发布时间】:2020-08-27 20:16:57
【问题描述】:

如何在更改某些值的同时将一个表复制到另一个表?

我的意思是例如:

perso=# create table chk ( id serial primary key, Q text , R  text not null unique, p text not null unique) ; 
CREATE TABLE
perso=# select * from chk
perso-# ;
 id | q | r | p 
----+---+---+---
(0 rows)

作为目的地

我会使用来自

的数据
perso=# select * from tmp                                                                                     
;
 idt | qt | rt | pt 
-----+----+----+----

我想将数据从 tmp 表复制到 chk 表,并在可能的情况下立即更新 chk 上的数据,所以 chk.p 等于 tmp.t 与crypt('t', gen_salt('bf'))

我尝试使用子选择进行复制,但出现了很多不同类型的错误……我无法解释也无法将它们全部粘贴在这里。

简短的询问:更新表中的数据以将结果存储在另一个表中

我想最好的方法应该是:

update chk 
set 
   ......
from tmp  (colums, crypt('t', gen_salt('bf'))
....

但是如何?

【问题讨论】:

    标签: sql postgresql encryption copy sql-insert


    【解决方案1】:

    要将行从一个表复制到另一个,您可以使用insert ... select。这是一种非常灵活的语法(select 部分可以使用常规 select 查询可以使用的所有功能),它可以让您以简单的方式做您想做的事情:

    insert into chk (id, q, r, p)
    select idt, dt, rt, crypt('t', gen_salt('bf')) 
    from tmp
    

    如果您想更新原始表:

    update tmp set pt = crypt('t', gen_salt('bf')) ;
    

    【讨论】:

    • 谢谢我现在明白了
    • 然后如何解密该列中的一行?
    • @francoisP:这是一个非常不同的问题。我不认为crypt() 是双向的,因为它是一个密码散列函数——而这些函数通常旨在防止反向算法。但是,您可以将加密值与非加密值进行比较。你可能想看看the pgcrypto documentation
    • 好酷,这意味着如果不能以这种方式阅读,它对我的​​需要是安全的。我将为 pgp_sym_encrypt 和 pgp_sym_decrypt 准备另一个数据库,这样我就可以分离两种访问模式。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2012-03-04
    相关资源
    最近更新 更多