SQL, skrypt, błąd przy wprowadzaniu danych


(_Kinga_) #1

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)

(Grzelix) #2

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.


(_Kinga_) #3

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?


(Grzelix) #4

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.


(Ktrojanek) #5

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:


(_Kinga_) #6

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


(Ktrojanek) #7

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.


(_Kinga_) #8

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