Создать таблицу двух типов в PostgreSQL

Я создал два типа:

Create  Type info_typ_1 AS (
Prod_id integer, 
category integer);

Create Type movie_typ AS(
title varchar(50),
actor varchar(50),
price float);

И я хочу создать таблицу, которая состоит из этих двух типов. Я знаю, что для таблицы, которая состоит из одного типа, это:

CREATE TABLE Table1 of type1
(
  primary key(prod_id)
);

Есть ли способ сделать это для двух типов, которые я создал выше?

То, что я пытался сделать (что неправильно), это создание третьего типа, который содержит первые два:

Create Type info_ AS (
info info_typ_1,
movie movie_typ);

а затем создание таблицы:

CREATE TABLE table1 of info_
(
  primary key(Prod_id)
);

Но это не работает. Я получаю эту ошибку:

ERROR:  column "prod_id" named in key does not exist
LINE 3:   primary key(Prod_id)
          ^
********** Error **********

ERROR: column "prod_id" named in key does not exist
SQL state: 42703
Character: 43

1 ответ

Решение

Вы не можете сделать prod_id первичный ключ table1 потому что единственными столбцами являются два составных типа info а также movie, Вы не можете получить доступ к базовым типам этих составных типов в PRIMARY KEY пункт.

То, что вы пытались сделать, работает с ограничением pk на info или же movie,
За исключением того, что это, вероятно, не то, что вы искали, что невозможно таким образом.

Вы могли бы реализовать что-то вроде этого с...

наследование

Здесь вы можете наследовать от нескольких родительских таблиц (заменить ваши типы). Пример:

CREATE TABLE info (
  prod_id integer
 ,category integer
);

CREATE TABLE movie (
   title text
  ,actor text
  ,price float
);

CREATE  TABLE movie_info (
   PRIMARY KEY(prod_id)             -- now we can use the base column!
)
INHERITS (info, movie);

INSERT INTO movie_info (prod_id, category, title, actor, price)
VALUES (1, 2, 'who donnit?', 'James Dean', '15.90');

SELECT * FROM movie_info;

-> SQLfiddle демонстрирует оба.

Обязательно прочитайте об ограничениях наследования в руководстве.

Другие вопросы по тегам