sql >> Databáze >  >> RDS >> Oracle

Jak vytvořím tabulku s omezeními při stahování dat z jiné tabulky

Zdá se, že pro tabulku WRITERS musíte použít složený klíč. Příklad (testováno s Oracle 12c a 11g, dbfiddle ):

-- 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 ) ;

Přidejte do tabulky BOOKAUTHOR nějaká omezení a zkontrolujte její obsah:

-- 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

"Původní" kód DDL (s drobnými úpravami) -> INSERT se nezdaří

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!

Doporučený kód DDL (a testování):

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.

VÝBĚR z 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 

Nejste si však jisti, proč byste potřebovali tabulku WRITERS, protože její data můžete generovat spuštěním dotazu.



  1. Co dělá COMMIT?

  2. Nahrávání souborů/obrázků blob do Mysql

  3. Nejlepší způsob, jak se vypořádat s datem při ukládání záznamů pro vyhledávač v MySQL?

  4. Změnit limit pro velikost řádku Mysql je příliš velká