DB2子表不起作用 - 创建表

时间:2010-04-22 14:44:34

标签: sql db2

我面前有一项任务。 (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 个答案:

答案 0 :(得分:1)

有几条评论,第一条:

  1. 父表必须具有主键或唯一键才能被外键引用。

  2. 您的帖子意味着您希望BookTitles成为子表(尽管这似乎对我不利)。从逻辑上讲,我认为您希望逻辑为:“如果您从BookTitles表中删除一本书,那么TitleAuthors表中的行也应该被删除” - 而不是相反。根据您对TitleAuthors表的描述,逻辑主键是(TITLE_ID,AU_ID)。这将排除它成为一个 父表到BookTitles,它不包含AU_ID。

  3. 创建表后添加约束要比在CREATE TABLE STATEMENT中尝试指定它更容易。


  4. 假设您希望您的父/子关系发生逆转(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;
    

    如果从BookTitles中删除标题,这将导致TitleAuthors中的记录被删除。