Mam taki problem przy tworzeniu bazy danych klientow i przypisanych do nich uslug.
Tworze tabele customers ze wspolnymi kolumnami dla klientow indywidualnych i przedsiebiorcow:
CREATE TABLE customers ( id INT NOT NULL DEFAULT NEXTVAL('customers_id') PRIMARY KEY, address VARCHAR(100) NOT NULL, location VARCHAR(100) NOT NULL, postcode VARCHAR(6) NOT NULL, email VARCHAR(200) NOT NULL UNIQUE, phone VARCHAR(30) NOT NULL, login VARCHAR(15) NOT NULL UNIQUE, password VARCHAR(32) NOT NULL );
Teraz chce rozdzielic to na klientow indywidualnych i przedsiebiorcow, wiec tworze 2 tabele dziedziczace:
CREATE TABLE corporation_customers ( name VARCHAR(200) NOT NULL, nip VARCHAR(13) NOT NULL UNIQUE ) INHERITS (customers); CREATE TABLE private_customers ( surname VARCHAR(80) NOT NULL, name VARCHAR(80) NOT NULL, pesel VARCHAR(11) NOT NULL UNIQUE ) INHERITS (customers);
I teoretycznie wszystko gra do momentu, kiedy nie stworze innej tabeli z kluczem obcym wskazujacym na tabele customers:
CREATE TABLE services ( id INT NOT NULL DEFAULT NEXTVAL('services_id'), description VARCHAR(255), customer_id INT NOT NULL, FOREIGN KEY(customer_id) REFERENCES customers(id) );
W momencie kiedy wywoluje INSERT zapisujacy usluge dla danego klienta:
INSERT INTO services (description, customer_id) VALUES ('Service no 1', 1);
otrzymuje blad, ze klucz 1 nie istnieje w tabeli customers
Klucz 1 istnieje w tabeli private_customers, ktora dziedziczy po customers. Dlaczego PostgreSQL nie widzi tego wpisu jako obecnego w tabeli customers?
SELECT * FROM customers;
Pokazuje mi ten wpis. Jezeli dam INSERT bezposrednio do tabeli customers, pomijajac tabele private_customers, corporation_customers wszystko dziala bez problemu. Wniosek z tego taki, ze postgres traktuje referencje do tabeli customers bezposrednio nie uwzgledniajac wpisow w tabelach potomkach. Troche mi to teraz komplikuje sprawe, bo nie chce trzymac danych klientow indywidualnych w jednej tabeli, bo chce narzucic wymog wpisania numeru pesel, numeru nip i dla przedsiebiorcow wprowadzic dodatkowe klucze obce.
Jak to mozna rozwiazac? Ma ktos pomysl, stawiam piwo!
Pozdrawiam