SQL, skrypt, błąd przy wprowadzaniu danych

Witam Was,

bardzo proszę o pomoc,

przygotowałam projekt bazy danych dla Biura Podróży,

oto skrypt,

uwaga są w nim związki za pomocą modyfikacji Alter Table,

tabela się tworzy, ale przy wprowadzaniu danych wyskakuje błąd:

Error starting at line 1 in command:

INSERT INTO PŁATNOŚĆ (IDPłatność, DATA_WPŁATY, WARTOŚĆ, IDKLIENTI)

VALUES

(‘R1’, to_date(‘05-01-2013’,‘DD-MM-YYYY’), 1750, ‘KI1’)

Error report:

SQL Error: ORA-02291: naruszono więzy spójności (STUD143813.SYS_C0079691) - nie znaleziono klucza nadrzędnego

02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"

*Cause: A foreign key value has no matching primary key value.

*Action: Delete the foreign key or add a matching primary key.

Co może być przyczyną?

Proszę o pomoc, ponieważ projekt muszę jutro oddać, jest to dla mnie bardzo ważne.

Create Table KLIENT_INDYWIDUALNY

(

IDKlientI nvarchar2(10) PRIMARY KEY,

Imię nvarchar2(25),

Nazwisko nvarchar2(25),

Płeć nvarchar2(1),

Data_urodzenia date NOT NULL,

IDKontakt nvarchar2(10) ,

IDPłatność nvarchar2(10)

)


Alter table KLIENT_INDYWIDUALNY

Add foreign key (IDKontakt) references KONTAKT(IDKontakt)



Create Table KLIENT_BIZNESOWY

(

IDKlientB nvarchar2(10) PRIMARY KEY,

Nazwa_pełna nvarchar2(45),

Nazwa_skrócona nvarchar2(25),

REGON numeric(9) NOT NULL,

NIP numeric(10) NOT NULL,

IDKontakt nvarchar2(10), 

IDPłatność nvarchar2(10)

)


Alter table KLIENT_BIZNESOWY

Add foreign key (IDKontakt) references KONTAKT(IDKontakt)



Create Table REZERWACJA

(

IDRezerwacja nvarchar2(10) PRIMARY KEY,

Wartość numeric(10,2),

Wartość_zaliczka numeric(10,2),

Rezerwacja_data date,

Płatność_sposób nvarchar2(25),

Status nvarchar2(15),

Sposób_promocji nvarchar2(45),

Odpowiedzialny_pracownik nvarchar2(45),

IDWycieczka nvarchar2(10),

IDKlientI nvarchar2(10),

IDKlientB nvarchar2(10)

)


Alter table REZERWACJA

Add foreign key (IDWycieczka) references WYCIECZKA(IDWycieczka)


Alter table REZERWACJA

Add foreign key (IDKlientI) references KLIENT_INDYWIDUALNY(IDKlientI)


Alter table REZERWACJA

Add foreign key (IDKlientB) references KLIENT_BIZNESOWY(IDKlientB)





Create Table TRANSPORT

(

IDTransport nvarchar2(10) PRIMARY KEY,

Nazwa_pełna nvarchar2(45),

Nazwa_skrócona nvarchar2(25),

REGON numeric(9) NOT NULL,

NIP numeric(10) NOT NULL,

IDKontakt nvarchar2(10) 

)


Alter table TRANSPORT

Add foreign key (IDKontakt) references KONTAKT(IDKontakt)




Create Table HOTEL

(

IDHotel nvarchar2(10) PRIMARY KEY,

Nazwa_pełna nvarchar2(45),

REGON numeric(9) NOT NULL,

NIP numeric(10) NOT NULL,

HotelStandard numeric(1),

IDKontakt nvarchar2(10) 

)


Alter table HOTEL

Add foreign key (IDKontakt) references KONTAKT(IDKontakt)




Create Table KONTAKT

(

IDKontakt nvarchar2(10) PRIMARY KEY,

Ulica nvarchar2(45),

Nr_domu nvarchar2(10),

Miejscowość nvarchar2(45),

Kod nvarchar2(5),

Region nvarchar2(25),

Telefon1 char(15),

Telefon2 char(15),

Telefon_fax char(15),

Email nvarchar2(45),

Strona_www nvarchar2(30),

)




Create Table ATRAKCJA

(

IDAtrakcja nvarchar2(10) PRIMARY KEY,

Nazwa nvarchar2(25),

Wartość numeric(10,2),

Państwo nvarchar2(25),

Liczba_miejsc numeric(6),

Opis nvarchar2(100),

Data_rozpoczęcia date,

Data_zakończenia date,

IDWycieczka nvarchar2(10) 

)


Alter table ATRAKCJA

Add foreign key (IDWycieczka) references WYCIECZKA(IDWycieczka)










Create Table WYCIECZKA

(

IDWycieczka nvarchar2(10) PRIMARY KEY,

Nazwa nvarchar2(45),

Państwo nvarchar2(25),

Wartość numeric(10,2),

Liczba_miejsc numeric(6),

Opis nvarchar2(100),

Data_rozpoczęcia date,

Data_zakończenia date,

)




Create Table PŁATNOŚĆ

(

IDPłatność nvarchar2(10) PRIMARY KEY,

Data_wpłaty date,

Wartość numeric(10,2),

IDKlientI nvarchar2(10) 

IDKlientB nvarchar2(10) 

)


Alter table PŁATNOŚĆ

Add foreign key (IDKlientI) references KLIENT_INDYWIDUALNY(IDKlientI)


Alter table PŁATNOŚĆ

Add foreign key (IDKlientB) references KLIENT_BIZNESOWY(IDKlientB)




Create Table TRANS_WYC

(

IDWycieczka nvarchar2(10),

IDTransport nvarchar2(10),

)


Alter table TRANS_WYC

Add foreign key (IDWycieczka) references WYCIECZKA(IDWycieczka)


Alter table TRANS_WYC

Add foreign key (IDTransport) references TRANSPORT(IDTransport)




Create Table HOT_WYC

(

IDWycieczka nvarchar2(10),

IDHotel nvarchar2(10)

)

Alter table HOT_WYC

Add foreign key (IDWycieczka) references WYCIECZKA(IDWycieczka)


Alter table HOT_WYC

Add foreign key (IDHotel) references TRANSPORT(IDHotel)

Błąd mówi tyle:

wprowadzany rekord ma referencję do klienta o ID ‘KI1’ ale taki klient nie istnieje więc nie można utworzyć takiego połączenie referencyjnego.

Jeśli najpierw uzupełnisz tabele klienci i wpiszesz tam rekord dla klienta z takim ID nie powinno być problemu.

Rozumiem,

próbuję dodać dane:

INSERT INTO KLIENT_INDYWIDUALNY

VALUES

(‘KI1’, ‘KINGA’, ‘MOSKA’, ‘K’, to_date(‘23.08.1992’,‘DD-MM-YYYY’))

Wyskakuje błąd:

Error at Command Line:1 Column:12

Error report:

SQL Error: ORA-00947: niewystarczająca liczba wartości

00947. 00000 - “not enough values”

*Cause:

*Action:

Podczas tworzenia do ID dałam typ danych nvarchar2(10), ponieważ w zależności od tabeli ID miało być wpisywane jako np. Klient_indywidualny: KI1 KI2, a klient biznesowy KB1, KB, rezerwacja R1, R2,

czy to może mieć związek, czy lepiej zamienić typ danych ID na numeric i wszędzie wpisywać “jak leci” 1,2,3…?

Mam nadzieję, że rozumiesz o co mi chodzi?

instrukcja insert ma dwa rodzaje wprowadzania danych:

INSERT INTO table_name

 VALUES (value1, value2, value3,...)

INSERT INTO table_name (column1, column2, column3,...)

 VALUES (value1, value2, value3,...)

jeśli użyjesz pierwszej to musisz podać wszystkie wartości - dla każdej z kolumn.

W przypadku drugim podajesz które kolumny uzupełniasz i jakimi wartościami. Tutaj należy pamiętać aby uzupełnić wszystkie kolumny z opcją NOT NULL.

ja bym wpisał tak:

INSERT INTO KLIENT_INDYWIDUALNY (IDKlientI, Imię, Nazwisko, Płeć, Data_urodzenia)

VALUES 

('KI1', 'KINGA', 'MOSKA', 'K', to_date('23.08.1992','DD-MM-YYYY'))

ponieważ nie wpisując kolumn z nawiasie baza oczekuje wartości dla wszystkich kolumn, a nie tylko dla np. pierwszych pięciu.

edit:

kolega był szybszy :wink:

Bardzo Wam dziękuję,

na chwilę obecną udało mi się uzupełnić tabelę.

A jeszcze pytanie dotyczące tych ID, chodzi o typ danych…

opisałam problem w moim 2 poście,

możecie się wypowiedzieć?

Ja mam tak:

jak tworzę tabelę w sql to jako id staram się zazwyczaj dawać int, daję we właściwościach “Is Identity” jako yes i nie mam problemu z nadawaniem kolejnych numerków, bo baza robi to za mnie, działa to tak jak “Autonumerowanie” w Accessie - nie wymaga to ode mnie pamiętania jakie ID jest już zajęte i nie martwię sie, żeby się nie powtórzyły, zdublowały. W Twoim przypadku przy ręcznym nadawaniu trzeba o tym pamiętać (chyba że aplikacja, która będzie korzystała z bazy sama będzie o tym “pamiętała” i to sprawdzała…).

Jakby nie było, jeśli tworzy się relacje to musi być ten sam typ danych.

Rozumiem,

będę wiedziała na przyszłość, teraz jest już za późno na poprawianie.

Serdecznie dziękuję za pomoc, jeśli napotkam jeszcze jakiś problem to napewno Was poproszę o radę.