Oracle SQL tworzenie klucza obcego

0

Cześć,

Mam pewien problem, chce napisać klucz obcy w bazie danych na oracle ale nie wiem gdzie robię błąd. Mam strukturę taką jak na zdjęciu jak tutaj http://prntscr.com/lkdp00

I do tego mam stukturę którą próbuję utworzyć.

ID_pracownika number(3,0) primary key, 
imie varchar2(15) not null, 
nazwisko varchar2(15) not null, 
stanowisko varchar2(15) not null, 
pesel number(11,0) not null, 
ulica varchar2(30) not null,
miejscowosc varchar2(30) not null,
mail varchar2(30),
telefon_kontaktowy varchar(15) not null, 
pensja number(6,0),
data_zatrudnienia date 
);
create table klient( 
ID_klienta number(10,0) primary key, 
imie varchar2(15) not null, 
nazwisko varchar2(15) not null,
ulica varchar2(30) not null,
miejscowosc varchar2(30) not null,
pesel number (11,0) not null, 
mail varchar2(30), 
telefon_kontaktowy number(20,0) not null, 
uwagi varchar2(100) 
);
create table samochod( 
ID_samochodu number (10) primary key, 
CONSTRAINT samochod FOREIGN KEY (marka) REFERENCES marka (nazwa), 
CONSTRAINT samochod FOREIGN KEY (model) REFERENCES model (nazwa),
pojemnosc_silnika number(4,0) not null, 
VIN varchar2(18) not null,
CONSTRAINT samochod FOREIGN KEY (ID_czynnosci) REFERENCES wykaz_czynnosci (ID_czynnosci),
CONSTRAINT samochod FOREIGN KEY (ID_klienta) REFERENCES klient (ID_klienta),  
);
create table wykaz_czynnosci( 
ID_czynnosci number(3,0) primary key, 
nazwa_czynnosci varchar2(25) not null, 
opis_czynnosci varchar2(100) 
);

create table wizyta( 
ID_wizyty number(4,0) primary key, 
CONSTRAINT wizyta FOREIGN KEY (ID_czynnosci) REFERENCES wykaz_czynnosci (ID_czynnosci),
CONSTRAINT wizyta FOREIGN KEY (ID_samochodu) REFERENCES samochod (ID_samochodu),
CONSTRAINT wizyta FOREIGN KEY (ID_pracownika) REFERENCES pracownik (ID_pracownika) 
);

create table marka( 
id_marka varchar2(30),
nazwa varchar2(30)
);

create table model( 
id_model varchar2(30), 
nazwa varchar2(30)
id_marka varchar2(30)
);

I jak wszystkie tabele zwykłe się tworzą to nie wiem czy dobrze próbuję utworzyć klucze obce za pomocą np. CONSTRAINT samochod FOREIGN KEY (model) REFERENCES model (nazwa),

Czy ktoś jest w stanie mi powiedzieć jak to zrobić? Szukałem w google i nie wiem w sumie czemu w każdym miejscu jest pokazany inny sposób.... Przepraszam za głupie pytanie bo pewnie jest ono nazbyt laickie

0

Nazwy CONSTRAINTów muszą być unikalne.
REFERENCES muszą się odwoływać do istniejących obiektów. Czyli jeśli masz
CONSTRAINT samochod FOREIGN KEY (ID_czynnosci) REFERENCES wykaz_czynnosci (ID_czynnosci), to wcześniej tabela wykaz_czynnosci musi istnieć, a tak nie jest.

0

Dziękuję serecznie za odpowiedź. Stworzyłem tabele wykaz czynności i chciałem stworzyć tabelę

create table samochod( 
ID_samochodu number (10) primary key, 
CONSTRAINT samochod FOREIGN KEY (marka) REFERENCES marka (nazwa), 
CONSTRAINT samochod FOREIGN KEY (model) REFERENCES n_model (nazwa),
pojemnosc_silnika number(4,0) not null, 
VIN varchar2(18) not null,
CONSTRAINT samochod FOREIGN KEY (ID_czynnosci) REFERENCES wykaz_czynnosci (ID_czynnosci),
CONSTRAINT samochod FOREIGN KEY (ID_klienta) REFERENCES klient (ID_klienta)
);

Wyświetla
Error report -
ORA-00904: "MARKA": niepoprawny identyfikator
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:

Ale skoro ja pobieram klucz z tabeli marka to jak mam inaczej to zdefiniować? Próbowałem zamiast marka wpisać coś "unikalnego" ale i tak wyświetla ten sam bład tylko z nową nazwą. Np. jak wpiszę marka1 to wyświetla ten sam błąd tylko z marka1.

1

Masz błędy składniowe i logiczne.

create table samochod( 
ID_samochodu number (10) primary key, 
CONSTRAINT samochod FOREIGN KEY (marka) REFERENCES marka (nazwa), 
CONSTRAINT samochod FOREIGN KEY (model) REFERENCES n_model (nazwa),
pojemnosc_silnika number(4,0) not null, 
VIN varchar2(18) not null,
CONSTRAINT samochod FOREIGN KEY (ID_czynnosci) REFERENCES wykaz_czynnosci (ID_czynnosci),
CONSTRAINT samochod FOREIGN KEY (ID_klienta) REFERENCES klient (ID_klienta)
);
  1. Tworzysz 4 różne FK i nazywasz je tak samo "samochod"
  2. W tych 4 FK używasz kolumny, której nie ma w tabeli "samochod", więc Oracle skarży się, że używasz słowka, którego nie rozumie. Powinieneś dodać tę kolumnę w tabeli i dopiero wtedy możesz użyć jej w definicji klucza obcego.

Coś w stylu:

create table samochod( 
ID_samochodu number (10) primary key, 
pojemnosc_silnika number(4,0) not null, 
VIN varchar2(18) not null,
marka ..., // ustaw właściwy typ danych 
model  ..., // ustaw właściwy typ danych 
id_czynnosci ..., // ustaw właściwy typ danych 
id_klienta ..., // ustaw właściwy typ danych
CONSTRAINT FK_SAMOCHOD_MARKA FOREIGN KEY (marka) REFERENCES marka (nazwa), 
CONSTRAINT FK_SAMOCHOD_MODEL FOREIGN KEY (model) REFERENCES n_model (nazwa),
CONSTRAINT FK_SAMOCHOD_WYKAZ FOREIGN KEY (ID_czynnosci) REFERENCES wykaz_czynnosci (ID_czynnosci),
CONSTRAINT FK_SAMOCHOD_KLIENT FOREIGN KEY (ID_klienta) REFERENCES klient (ID_klienta)
);

1 użytkowników online, w tym zalogowanych: 0, gości: 1