sql—为表的所有列设置默认值

gab6jxml  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(407)

我有很多列的多个表。某些列包含 Null 价值观。现在,我想将它们设置为默认值(空字符串或0)。
我找到了两个sql语句,它们可能满足了我的需要,但我无法将它们放在一起。

select column_name,data_type 
from information_schema.columns 
where table_name = 'tablename';

我可以使用上面的代码来更新所有列及其数据类型和下面的代码段 Null 列中的值。

Update tablename Set col1 = ''
Where col1 Is Null;

我怎样才能把这两个放在一起?抱歉,如果这是一个基本问题,但我找不到解决方法。。。

t5fffqht

t5fffqht1#

当然,这不是一个基本的问题,解决这个问题有点难(不是Maven的问题)。您必须从表中存储的系统数据生成sql语句 pg_attribute 以及 pg_attrdef .
您可以运行以下查询。结果是文本 UPDATE 命令,这就是你想要的:

select 'update foo set ' || 
       string_agg(attname || 
                  ' = coalesce(' || attname || ', '|| 
                               (select pg_catalog.pg_get_expr(d.adbin, d.adrelid, true) 
                                  from pg_catalog.pg_attrdef d 
                                 where d.adrelid = a.attrelid 
                                   and d.adnum = a.attnum 
                                   and a.atthasdef )  || ')', ', ') 
 from pg_attribute a 
where attrelid = 'foo'::regclass and attnum > 0;

例子:

create table foo(a int default 0, b varchar default '');

运行query得到:

┌───────────────────────────────────────────────────────────────────────────┐
│                                 ?column?                                  │
╞═══════════════════════════════════════════════════════════════════════════╡
│ update foo set a = coalesce(a, 0), b = coalesce(b, ''::character varying) │
└───────────────────────────────────────────────────────────────────────────┘
(1 row)

现在您可以运行:

update foo set a = coalesce(a, 0), b = coalesce(b, ''::character varying)

相关问题