Может ли столбец таблицы ссылаться на эту же таблицу?

В описании задания есть описание таблицы:

-- Таблица каталога продуктов
create table catalog (
    cid number primary key, -- id раздела
    par_cid number references catalog, -- ссылка на родительский раздел
    rname varchar2(400), -- наименование раздела
    rdescr varchar2(4000), -- описание
    rcdate date -- дата создания
);

Правильно ли написан код создания таблицы catalog в строке:

par_cid number references catalog, -- ссылка на родительский раздел 

Может ли столбец таблицы catalog ссылаться на эту же таблицу catalog?


Ответы (1 шт):

Автор решения: 0xdb

Может ли столбец таблицы catalog ссылаться на эту же таблицу catalog?

Да, может. Это ссылка таблицы на саму себя.

Точнее, будет создан внешний ключ (foreign key=FK), ссылающийся (references) на первичный ключ (primary key=PK) этой же таблицы. Последний можно по умолчанию не указывать, так как он гарантированно только один в таблице.

Полная запись (рекомендованный способ записи) выглядела бы так:

create table catalog (
    cid number primary key, 
    par_cid number, 
    rname varchar2(400), 
    rdescr varchar2(4000), 
    rcdate date,
    constraint fk_catalog foreign key (par_cid) references catalog (cid))
/

Простейший пример данных и типичный запрос с ними:

insert into catalog 
    select 1, null, 'catalog1', 'main catalog', sysdate from dual union all
    select 2,    1, 'catalog2', 'under catalog1', sysdate from dual union all
    select 3,    1, 'catalog3', 'under catalog1', sysdate from dual
/

select  cid, par_cid, rname name, lpad (' ', (level-1)*4)||rdescr descr
from catalog 
start with par_cid is null
connect by par_cid = prior cid
/

       CID    PAR_CID NAME     DESCR                           
---------- ---------- -------- --------------------------------
         1            catalog1 main catalog                    
         2          1 catalog2     under catalog1              
         3          1 catalog3     under catalog1              
→ Ссылка