Дочерняя таблица DB2 не работает - Создать таблицу - PullRequest
0 голосов
/ 22 апреля 2010

Передо мной стоит небольшая задача. (База данных DB2) Мне нужно создать таблицу, которая будет дочерней таблицей (это то, что она называется в SQL?) Мне нужно, чтобы у него было ограничение внешнего ключа с моей другой таблицей, чтобы при изменении родительской таблицы (удаление записи) дочерняя таблица также теряла эту запись.

После того, как у меня есть таблица, мне также нужно заполнить ее данными из другой таблицы (если есть простой способ UPDATE этого).

Если бы вы указали мне правильное направление, это бы очень помогло, поскольку я даже не знаю, какой синтаксис искать.

Таблица у меня на месте:

create table titleauthors (
    au_id       char(11),
    title_id    char(6),
    au_ord      integer,
    royaltyshare    decimal(5,2));

Таблица, которую я создаю:

create table titles (
    title_id    char(6),
    title       varchar(80),
    type        varchar(12),
    pub_id      char(4),
    price       decimal(9,2),
    advance     decimal(9,2),
    ytd_sales   integer,
    contract    integer,
    notes       varchar(200),
    pubdate     date);

Мне нужно, чтобы title_id сопоставлялся с title_id из родительской таблицы И использовать синтаксис ON DELETE CASCADE для удаления при удалении этой таблицы из.

Моя попытка:

CREATE TABLE BookTitles (
title_id    char(6) NOT NULL CONSTRAINT BookTitles_title_id_pk REFERENCES titleauthors(title_id) ON DELETE CASCADE,
title       varchar(80) NOT NULL,
type        varchar(12),
pub_id      char(4),
price       decimal(9,2),
advance     decimal(9,2),
ytd_sales   integer,
contract    integer,
notes       varchar(200),
pubdate     date)
;

1 Ответ

1 голос
/ 22 апреля 2010

Пара комментариев, сначала:

  1. Родительская таблица должна иметь первичный или уникальный ключ, чтобы на нее ссылался внешний ключ.

  2. Ваше сообщение подразумевает, что вы хотите, чтобы BookTitles были дочерней таблицей (хотя это кажется мне обратным). Логично, что я думаю, что вы хотите, чтобы логика была такой: «Если вы удалите книгу из таблицы BookTitles, то строки из таблицы TitleAuthors тоже должны быть удалены», а не наоборот. Исходя из вашего описания таблицы TitleAuthors, логический первичный ключ (TITLE_ID, AU_ID). Это помешало бы ему быть родительская таблица для BookTitles, которая не содержит AU_ID.

  3. Гораздо проще добавить ограничения после создания таблицы, чем пытаться указать ее в CREATE TABLE STATEMENT.


Предполагая, что вы хотите изменить отношения между родителями и детьми (BookTitles как родительские, TitleAuthors как дочерние):

CREATE TABLE BookTitles (
    title_id    char(6) NOT NULL,
    title       varchar(80) NOT NULL,
    type        varchar(12),
    pub_id      char(4),
    price       decimal(9,2),
    advance     decimal(9,2),
    ytd_sales   integer,
    contract    integer,
    notes       varchar(200),
    pubdate     date
);

alter table booktitles 
   add primary key (title_id);

alter table titleauthors
   add constraint fk_booktitles
   foreign key (title_id) 
   references booktitles (title_id)
    on delete cascade;

Это приведет к удалению записей в TitleAuthors, если заголовок будет удален из BookTitles.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...