从数据库系统概念开始,针对对象关系数据库的SQL命令:
create type Publisher as
(name varchar(20),
branch varchar(20));
create type Book as
(title varchar(20),
author array varchar(20) array [10],
pub date date,
publisher Publisher,
keyword set varchar(20) multiset);
insert into books
values (’Compilers’, array[’Smith’, ’Jones’],
new Publisher(’McGraw-Hill’, ’New York’),
multiset[’parsing’, ’analysis’]);
create table flat_Book as
(title varchar(20),
author array varchar(20) array [10],
pub_name varchar(20),
pub_branch varchar(20));
select title, author, Publisher(pub_name, pub_branch) as publisher
from flat_books
group by title, author, publisher;
其中的Publisher(pub_name, pub_branch)
和Publisher()
是什么?
Publisher()
似乎不是Publisher
类型的构造方法,因为对构造方法的调用需要new
,例如new Publisher(’McGraw-Hill’, ’New York’)
。
我想PostgreSQL可能有类似的命令,因为它很好地遵循了SQL标准,并且还是对象关系DBMS。
谢谢。
答案 0 :(得分:2)
正如Laurenz Albe在回答昨天的类似问题时提到的那样,create table T
在幕后进行了隐式create type T
的创建,以创建具有与表相同结构的复合类型。
然后我们看一下type casts in the fine manual:
类型转换指定从一种数据类型到另一种数据类型的转换。 PostgreSQL的 接受两种等效的类型转换语法:
CAST ( expression AS type ) expression::type
[...]
也可以使用类似函数的语法来指定类型转换:
typename ( expression )
并且:
注意
类似函数的语法实际上只是一个函数调用。当使用两种标准强制转换语法之一进行运行时转换时,它将在内部调用注册的函数来执行转换。按照惯例,这些转换函数与其输出类型具有相同的名称,因此“类似于函数的语法”无非就是直接调用基础转换函数。
将它们放在一起:
create table publisher
也会执行create type publisher
。T
,T(expr)
是类型转换。publisher(a, b)
本质上是使用基础类型转换函数的类型转换。查看文档的Composite Types部分也将有所帮助。