PostgreSQL数据类型--复合类型

 2015年03月30日    237     声明


PostgreSQL复合类型描述一行或者一条记录的结构,实际上它只是一个字段名和它们的数据类型的列表。在PostgreSQL中你可以像使用简单数据类型那样使用复合类型。


1.复合类型声明

复合类型只能声明字段名字和类型,不能声明约束(比如 NOT NULL 这样的)。使用复合类型需要先定义,之后在创建表的语句中引用定义的复合类型。示例如下:

CREATE TYPE student_lesson AS (
    name            text,
    times           numeric
);
CREATE TABLE students (
    name       text,
    lesson      student_lesson
);


2.复合类型数据插入

复合类型数据插入要以文本常量书写复合类型值,在圆括弧里包括字段值并且用逗号分隔,如果值本身包含逗号或者圆括弧,刚需要用双引号括起来。 复合类型常量的一般格式如下:

'( val1 , val2 , ... )'

例如,在上一步创建的表中插入数据:

test=# INSERT INTO students VALUES('itbilu','("math", 3)');INSERT INTO students VALUES('liuht',ROW('math', 5));
INSERT 0 1
test=# SELECT * FROM students;
  name  |  lesson  
--------+----------
 itbilu | (math,3)
 liuht  | (math,5)

(1 row)


3.复合类型查询

要访问复合类型字段的一个子字段,需要按字段名.子字段的形式查询,非常类似从一个表名字里查出一个字段。为避免分析器混淆,需要在查询的复合类型字段外增加圆括弧。示例如下:

test=#SELECT lesson.name FROM students;
ERROR:  missing FROM-clause entry for table "lesson"     --不加圆括号会按表查询,查询失败
LINE 1: SELECT lesson.name FROM students;
               ^
test=# SELECT (lesson).name FROM students;               --正确的查询方法
 name 
------
 math
 math
(1 row)

如查在查询中需要使用表名,并按复合类型的子字段进行筛选。可参考下面的示例进行查询:

test=# SELECT students.name, (students.lesson).name FROM students WHERE (students.lesson).times>3;
 name  | name 
-------+------
 liuht | math
(1 row)


4.复合类型数据修改

修改复合类型数据时,可以整体更新复合类型字段,也可更新复合类型字段的子字段。示例如下:

test=# UPDATE students SET lesson = ROW('Liuht', 6) WHERE name = 'liuht';      --整字段更新
 UPDATE 1

test=# UPDATE students SET lesson.times = 7 WHERE name = 'itbilu';     --子字段更新                                                                                      
UPDATE 1

test=#SELECT * FROM students;
  name  |  lesson   
--------+-----------
 liuht  | (Liuht,6)
 itbilu | (math,7)
(2 rows)