什么是Publisher(pub_name,pub_branch)中的Publisher()?

时间:2018-07-19 22:07:09

标签: sql postgresql object-relational-model

从数据库系统概念开始,针对对象关系数据库的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。

谢谢。

1 个答案:

答案 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
  • 对于给定类型TT(expr)是类型转换。
  • 因此publisher(a, b)本质上是使用基础类型转换函数的类型转换。

查看文档的Composite Types部分也将有所帮助。