How do I create a table with constraints while pulling data from another table

后端 未结 2 927
情深已故
情深已故 2021-01-16 17:37

I am trying to create a writers table that contains the author ID, last name, first name, and ISBN and title of the book each author wrote. While using the same data types a

相关标签:
2条回答
  • 2021-01-16 18:04

    Maybe try this:

       CREATE TABLE writers(
            authorid VARCHAR2(4),
            lname VARCHAR2(10),
            fname VARCHAR2(10),
            isbn VARCHAR2(10),
            title VARCHAR2(30) NOT NULL,
            CONSTRAINT wt_pk FOREIGN KEY(authorid) REFERENCES author(authorid),
            CONSTRAINT wt_fk FOREIGN KEY(isbn) REFERENCES books(isbn),
            UNIQUE KEY unique_authorid(authorid)
        );
    

    Just make sure this line references your author table primary key (now it is authorid)

    CONSTRAINT wt_pk FOREIGN KEY(authorid) REFERENCES author(authorid),
    

    Also remove unique index if don't need it. And in your example you probably don't need it, becouse one author can have multiple book titles. You should clarify what you trying to accomplish.

    0 讨论(0)
  • 2021-01-16 18:08

    It seems that you need to use a composite key for your WRITERS table. Example (tested with Oracle 12c and 11g, dbfiddle here):

    -- 4 authors
    create table author ( authorid primary key, fname, lname )
    as
    select 1, 'fname_1', 'lname_1' from dual union all
    select 2, 'fname_2', 'lname_2' from dual union all
    select 3, 'fname_3', 'lname_3' from dual union all
    select 4, 'fname_4', 'lname_4' from dual ;
    
    -- 7 books
    create table books ( isbn primary key, title )
    as
    select '978-1449324451', 'title_1' from dual union all
    select '978-1449324452', 'title_2' from dual union all
    select '978-1449324453', 'title_3' from dual union all
    select '978-1449324454', 'title_1_4' from dual union all 
    select '978-1449324455', 'title_2_4' from dual union all
    select '978-1449324456', 'title_3_4' from dual union all
    select '978-1449324457', 'title_4_4' from dual ;
    
    -- suppose that 4 books are written by one and the same author
    create table bookauthor( authorid, isbn )
    as
    select A.authorid, B.isbn
    from author A 
      join books B on A.authorid = substr( B.title, length( B.title ), 1 ) ;
    

    Add some constraints to the BOOKAUTHOR table, and check its contents:

    -- authorid, isbn
    alter table bookauthor 
    add (
      constraint ba_fk1 foreign key( authorid ) references author( authorid )
    , constraint ba_fk2 foreign key( isbn ) references books( isbn )
    , constraint ba_pk primary key ( authorid, isbn )
    ) ;
    
    
    SQL> select * from bookauthor;
      AUTHORID ISBN          
    ---------- --------------
             1 978-1449324451
             2 978-1449324452
             3 978-1449324453
             4 978-1449324454
             4 978-1449324455
             4 978-1449324456
             4 978-1449324457
    

    "Original" DDL code (with minor modifications) -> INSERT fails

    create table writers (
      authorid varchar2( 4 )
    , lname varchar2( 10 )
    , fname varchar2( 10 )
    , isbn char( 14 )
    , title varchar2( 30 ) constraint title_nn not null
    , constraint wt_pk primary key ( authorid )
    , constraint wt_fk foreign key( isbn ) references books( isbn )
    );
    
    INSERT INTO writers
    SELECT authorid, fname, lname, isbn, title 
    FROM author 
       JOIN bookauthor USING(authorid) 
       JOIN books USING(isbn);
    -- ORA-00001: unique constraint (...WT_PK) violated 
    -- author 4 with 4 books!
    

    Suggested DDL code (and testing):

    create table writers2 (
      authorid varchar2( 4 )
    , lname varchar2( 10 )
    , fname varchar2( 10 )
    , isbn char( 14 )
    , title varchar2( 30 ) constraint title_nn2 not null
    , constraint wt_pk2 primary key ( authorid, isbn )
    , constraint wt_fk2 foreign key( isbn ) references books( isbn )
    );
    
    INSERT INTO writers2
    SELECT authorid, fname, lname, isbn, title 
    FROM author 
       JOIN bookauthor USING(authorid) 
       JOIN books USING(isbn);
    -- 7 rows inserted.
    

    SELECTing from WRITERS2:

    SQL> select * from writers2 ;
    
    AUTH LNAME      FNAME      ISBN           TITLE                         
    ---- ---------- ---------- -------------- ------------------------------
    1    fname_1    lname_1    978-1449324451 title_1                       
    2    fname_2    lname_2    978-1449324452 title_2                       
    3    fname_3    lname_3    978-1449324453 title_3                       
    4    fname_4    lname_4    978-1449324454 title_1_4                     
    4    fname_4    lname_4    978-1449324455 title_2_4                     
    4    fname_4    lname_4    978-1449324456 title_3_4                     
    4    fname_4    lname_4    978-1449324457 title_4_4 
    

    Not sure why you would need the WRITERS table, though - as you can generate its data by running a query.

    0 讨论(0)
提交回复
热议问题