PostgreSQL-创建表-在复合类型内的属性中应用诸如主键之类的约束

PostgreSQL-创建表-在复合类型内的属性中应用诸如主键之类的约束,postgresql,create-table,Postgresql,Create Table,我想使用PostgreSQL实现一个对象关系数据库。我不想使用ORACLE。 我是否可以创建一个复合类型,然后在表中使用它,例如在它的一个属性中添加主键的限制? 下面我举一个例子: CREATE TYPE teamObj AS ( idnumeric, name character varying, city character varying, estadiumName character varying, jugadores playerObj[] )

我想使用
PostgreSQL
实现一个对象关系数据库。我不想使用
ORACLE
。 我是否可以创建一个复合类型,然后在表中使用它,例如在它的一个属性中添加主键的限制? 下面我举一个例子:

CREATE TYPE teamObj AS (
    idnumeric,
    name character varying,
    city character varying,
    estadiumName character varying,
    jugadores playerObj[]
);

CREATE TABLE teamTable (
    equipo equipoobj,
    PRIMARY KEY (equipo.id)
);
主键(equipo.id)给出了一个错误,我已经阅读了很多关于这个主题的文档,我没有找到解决方案,可能PostgreSQL还没有实现,或者永远不会实现,或者我不明白如何运行PostgreSQL

有人有解决办法吗


谢谢。

不,您不能这样做,我建议您不要创建这样的表

表定义应该与类型定义非常相似。不需要中间类型定义

原因:

  • 这不会使您的模式更具可读性

  • 这违反了关系数据库的第一个标准形式

  • 这与面向对象的设计不比简单的表定义更匹配

作为安慰,每当您定义一个表时,PostgreSQL都会隐式定义一个同名的复合类型,因此您可以执行以下操作

CAST(ROW(12, 'Raiders', 'Wolfschoaßing', 'Dorfwiesn', NULL) AS team)


我觉得您只需要一个表
团队
。。PostgreSQL将自动为您提供类型
team
,数据类型和属性名称与表中的一行相同;我尝试了所有的变化,包括那些声称对其他SO问题有效的变化,但没有发现任何有效的变化。不过我同意伊斯林格尔的观点;用你在这里建议的方式使用一种字体只会让一切变得更加困难,我已经放弃了尝试。我已经使用Oracle很多年了,我认为PostgreSQL并没有以同样的方式实现它。所以我必须改变。我会照你说的做。谢谢。您也不会在Oracle中定义这样的表。不必要地使用复合类型不是一个好的数据库设计。
CREATE FUNCTION getteam(id) RETURNS team