在数据库系统概念中,对于对象关系数据库的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标准,而且也是对象关系型数据库管理系统。
谢谢。
发布于 2018-07-20 12:37:48
正如Laurenz Albe在回答昨天的类似问题时提到的,create table T在幕后执行隐式create type T,以创建具有与表相同结构的复合类型。
然后我们来看一下type casts in the fine manual
类型转换指定从一种数据类型到另一种数据类型的转换。PostgreSQL接受两种等价的类型转换语法:
CAST (表达式作为类型) expression::type
..。
还可以使用类似函数的语法指定类型转换:
typename (表达式)
和:
备注
类似函数的语法实际上只是一个函数调用。当两种标准强制转换语法中的一种用于执行运行时转换时,它将在内部调用一个已注册的函数来执行转换。按照惯例,这些转换函数具有与其输出类型相同的名称,因此“类似函数的语法”只不过是对底层转换函数的直接调用。
把这些放在一起:
create table publisher还对给定的类型T执行create type publisher.T(expr)是一种类型转换。publisher(a, b)本质上是使用基础类型转换函数的类型转换。查看文档的Composite Types部分也会很有帮助。
https://stackoverflow.com/questions/51432380
复制相似问题