
# 定义一个复数类型
CREATE TYPE complex AS (
r double precision,
i double precision
);
# 定义一个“person”类型
CREATE TYPE person AS (
name text,
age integer,
sex boolean
);
# 用复合类型创建表
CREATE TABLE capacitance_test_data(
test_time timestamp,
voltage complex,
current complex
);

复合类型的输入
- 复合类型常量的格式使用的是单引号加圆括号的一种格式;
- 在此格式中,可以在任何字段值周围加上双引号,如果值本身包含逗号或者圆括弧,则必须用双引号括起来;
CREATE TABLE author(
id int,
person_info person,
book text
);
insert into author values( 1, '("张三",29,TRUE)', '张三的自传');

# 要让一个字段值是“NULL”,那么在列表里它的位置上就不要写任何字符
insert into author values( 2, '("李四",,TRUE)','李四的自传');
# 如果想要一个空字符串,而不是“NULL”,则需要写一对双引号
insert into author values(3,'("",,TRUE)', 'x的自传');
# 可以用ROW表达式语法来构造复合类型值。在大多数场合下,这种方法比用字符串文本的语法更简单,因为不用操心多重引号转义导致的问题。
insert into author values( 4, ROW('王麻子', 29, TRUE), '自传');
# 只要表达式里有一个以上的字段,那么关键字ROW实际上也就是可选的
insert into author values(5, ('王五', 29, TRUE), '自传');

复合类型的访问
访问复合类型,使用点和域从复合类型中选出一个字段显示,但是在字段前应该加上括号将复合类型名称括起来,避免SQL解析器混淆报错。
select person_info.name from author;
ERROR: missing FROM-clause entry for table "person_info"
LINE 1: select person_info.name from author;
# 系统报错,需要在字段名称中加圆括号
select (person_info).name from author;
# 也可以加上表名
select (author.person_info).name from author;

复合类型的修改
# 更新整个字段
UPDATE author SET person_info = ROW('李成', 39, TRUE) WHERE id =1;
UPDATE author SET person_info = ('王二', 49, TRUE) WHERE id =2;
# 只更新一个复合字段的某个子域
UPDATE author SET person_info.name ='王二二' WHERE id =2;
UPDATE author SET person_info.age = (person_info).age + 1 WHERE id =2;
# 不能在“SET”后的字段名周围加圆括弧,但是需要在等号右边的表达式里引用同一个字段的时候加上圆括弧,否则系统会报错
UPDATE author SET (person_info).name ='王二二' WHERE id =2;
UPDATE author SET person_info.age =person_info.age + 1 WHERE id =2;
# INSERT也可以指定复合字段的子域
INSERT INTO author (id, person_info.name,person_info.age) VALUES(10, '赵六',30);

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




