Создать таблицу двух типов в 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 демонстрирует оба.
Обязательно прочитайте об ограничениях наследования в руководстве.