PostgreSQL create table like/as创建新表pg_attribute.attndims变为0
PostgreSQL 数据库对于包含数组类型的表,通过 create table like/as 语法创建的新表与原表结构不一致,新表数组字段的 pg_attribute.attndims 值为 0,原表不为 0。
有些场景下需要对比两个表的结构是否一致时,需要注意这个问题。
示例如下:
postgres=# \d test1;
Table "public.test1"
Column | Type | Modifiers
--------+-----------+-----------
id | integer |
datas | integer[] |
d2 | integer[] |
d3 | integer[] |
postgres=# create table test2 (like test1);
CREATE TABLE
postgres=# \d test2;
Table "public.test2"
Column | Type | Modifiers
--------+-----------+-----------
id | integer |
datas | integer[] |
d2 | integer[] |
d3 | integer[] |
postgres=# select att.attname, att.attndims from pg_attribute att, pg_class
c where c.relname='test1' and att.attrelid = c.oid;
attname | attndims
----------+----------
tableoid | 0
cmax | 0
xmax | 0
cmin | 0
xmin | 0
ctid | 0
id | 0
datas | 1
d2 | 2
d3 | 3
postgres=# select att.attname, att.attndims from pg_attribute att, pg_class
c where c.relname='test2' and att.attrelid = c.oid;
attname | attndims
----------+----------
tableoid | 0
cmax | 0
xmax | 0
cmin | 0
xmin | 0
ctid | 0
id | 0
datas | 0
d2 | 0
d3 | 0
(10 rows)
postgres=# create table test3 as select * from test1;
SELECT 1
postgres=# \d test3;
Table "public.test3"
Column | Type | Modifiers
--------+-----------+-----------
id | integer |
datas | integer[] |
d2 | integer[] |
d3 | integer[] |
postgres=# select att.attname, att.attndims from pg_attribute att, pg_class
c where c.relname='test3' and att.attrelid = c.oid;
attname | attndims
----------+----------
tableoid | 0
cmax | 0
xmax | 0
cmin | 0
xmin | 0
ctid | 0
id | 0
datas | 0
d2 | 0
d3 | 0
(10 rows)
参考资料:
文章评论
共0条评论