【问题标题】:PostgreSQL - CREATE TABLE - Apply constraints like PRIMARY KEY in attributes that are inside composite typesPostgreSQL - CREATE TABLE - 在复合类型内的属性中应用 PRIMARY KEY 等约束
【发布时间】:2019-10-06 08:05:15
【问题描述】:

我想使用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)
);

PRIMARY KEY (equipo.id)这行报错,我看了很多这个主题的文档,没找到解决办法,可能是PostgreSQL没有实现然而,或者永远不会实现它,或者我不明白 PostgreSQL 是如何运行的......

有人有解决方案吗?

谢谢。

【问题讨论】:

  • 我觉得你只需要一个表team.. PostgreSQL 会自动为你提供类型team 与表的一行相同的数据类型和属性名。
  • 我不认为你可以;我已经尝试了所有变体,包括那些声称通过其他 SO 问题起作用的变体,但没有找到任何可行的方法。不过,我同意 Islingre 的观点;以您在此处建议的方式使用类型只会使一切变得更加困难

标签: postgresql create-table


【解决方案1】:

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

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

原因:

  • 这不会使您的架构更具可读性

  • 违反了关系数据库的第一范式

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

为了方便起见,PostgreSQL 会在你定义一个表时隐式定义一个同名的复合类型,所以你可以做类似的事情

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

CREATE FUNCTION getteam(id) RETURNS team

【讨论】:

  • 我已经放弃尝试了。我已经使用 Oracle 多年了,我认为 PostgreSQL 并没有以同样的方式实现它。所以必须改变的是我。我会照你说的去做。谢谢。
  • 您也不会在 Oracle 中定义这样的表。不必要地使用复合类型并不是一个好的数据库设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多