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)