【问题标题】:What is `Publisher()` in `Publisher(pub_name, pub_branch)`?`Publisher(pub_name, pub_branch)` 中的 `Publisher()` 是什么?
【发布时间】:2018-12-28 03:59:06
【问题描述】:

来自数据库系统概念,对象关系数据库的 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。

谢谢。

【问题讨论】:

    标签: sql postgresql object-relational-model


    【解决方案1】:

    正如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 部分也会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多