2010-04-22 30 views
0

我有一些任务摆在我面前。 (DB2数据库) 我需要创建一个表,这将是一个子表(这是什么它在SQL调用?) 我需要它,以便它与我的其他表有一个外键约束,所以当父表被修改(记录删除)子表也丢失了该记录。DB2子表无法正常工作 - 创建表

一旦我有了表格,我还需要用另一个表格中的数据填充它(如果有一个简单的方法可以使用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. 父表必须有一个主键或唯一键,以便它通过一个外键引用。

  2. 你的文章暗示你希望BookTitles是子表(尽管这看起来倒退了)。从逻辑上讲,我认为你想要的逻辑是:“如果你从BookTitles表中删除一本书,那么TitleAuthors表中的行也应该被删除” - 而不是相反。从您对TitleAuthors表的描述中,逻辑主键是(TITLE_ID,AU_ID)。这将阻止它成为BookTitles的父表的 父表,该表不包含AU_ID。

  3. 在创建表之后添加约束比试图在CREATE TABLE语句中指定它要容易得多。


假设你希望你的父/子关系逆转(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中删除。