Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dziedziczenie w sql
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
misty
witam mam maly problem (albo czegos do konca nie rozumiem).

powiedzmy ze mamy tabele:
1sza:
# create table test (test_id serial primary key not null, test char(10) not null, test2 char(10) not null);

i 2ga ktora od niej dziedziczy:
# create table aa (aa_id serial primary key not null, ulubione char(10)) inherits (test);


w tym momencie do mojej drugiej tableli, tj. aa zostana przypisane kolumny z 1szej, tj. z test

test_id | test | test2 | aa_id | ulubione
---------+------+-------+-------+----------
(0 rows)

w tabeli aa trzymam 'ulubione' pozycje z tableli test. powiedzmy ze do obu tabel wstawie jakies przykladowe dane:

test:

test_id | test | test2
---------+------------+------------
1 | aa | bb
2 | cc | dd
3 | ee | ff


aa:

test_id | test | test2 | aa_id | ulubione
---------+------------+------------+-------+------------
2 | cc | dd | 1 | zz


gdy wydam komende:
# select * from only test;
spodziewalam sie otrzymac tylko te kolumny ktore wystepuja w test (czyli poza ta ktora jest rowniez w aa), jednak otrzymuje wszystkie, tj:
test_id | test | test2
---------+------------+------------
1 | aa | bb
2 | cc | dd
3 | ee | ff
(3 rows)

ktos moglby naprowadzic mnie na prawidlowy zapis tudziez prawidlowy tok myslenia?
pzdr!
dr_bonzo
Postgresql? czy jakas inna baza -- to bede wiedzial gdzie przeniesc.
misty
postgres..
wrzucilam nie tu? bylo napisane ze dla poczatkujacych.. a z postgresem poczatkuje..
dr_bonzo
Tja, i zajmujesz sie takimi zupelnie noobowskimi zagadnieniami jak dziedziczenie tabel? smile.gif

Przenosze
misty
dobra przenos, tylko nie usuwaj tematu;) poprawie sie na przyszlosc;)
pzdr!

ps. to jak ktos wie co z tym dziedziczeniem?
dr_bonzo
Sprawdzilem to na pg 8.1 (i innych danych, 3ch rodzicow + dziecko z innym ID rodzica) i jest OK.
ONLY wyswietla TYLKO rodzicow (tabele test -- zmien prosze nazwy tabel i pol, bo ciezko mi rozroznic, co jest co)

Tylko ze u siebie masz:

Kod
test:
test_id | test | test2
---------+------------+------------
1 | aa | bb
2 | cc | dd             --  TO
3 | ee | ff


Kod
test_id | test | test2 | aa_id | ulubione
---------+------------+------------+-------+------------
2 | cc | dd | 1 | zz -- tu masz INNY rekord z takimi samymi danymi 'cc', 'dd'


i w
SELECT * FROM ONLY test
pokazuje sie rekord z rodzica (test) a nie (dziecka)

bez ONLY oba sie pojawia.

--------
backup moich tabel:
Kod
--
-- PostgreSQL database dump
--

-- Started on 2007-01-02 18:48:37 CET

SET client_encoding = 'UTF8';
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- TOC entry 1189 (class 1259 OID 45755)
-- Dependencies: 4
-- Name: rodzic; Type: TABLE; Schema: public; Owner: mike; Tablespace:
--

CREATE TABLE rodzic (
    rodzic_id serial NOT NULL,
    rodzic character(10) NOT NULL,
    rodzic2 character(10) NOT NULL
);


--
-- TOC entry 1518 (class 0 OID 0)
-- Dependencies: 1188
-- Name: rodzic_rodzic_id_seq; Type: SEQUENCE SET; Schema: public; Owner: mike
--

SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('rodzic', 'rodzic_id'), 5, true);


--
-- TOC entry 1516 (class 0 OID 45755)
-- Dependencies: 1189
-- Data for Name: rodzic; Type: TABLE DATA; Schema: public; Owner: mike
--

INSERT INTO rodzic (rodzic_id, rodzic, rodzic2) VALUES (1, 'aa        ', 'AA        ');
INSERT INTO rodzic (rodzic_id, rodzic, rodzic2) VALUES (2, 'bb        ', 'BB        ');
INSERT INTO rodzic (rodzic_id, rodzic, rodzic2) VALUES (3, 'cc        ', 'CC        ');


--
-- TOC entry 1515 (class 2606 OID 45759)
-- Dependencies: 1189 1189
-- Name: rodzic_pkey; Type: CONSTRAINT; Schema: public; Owner: mike; Tablespace:
--

ALTER TABLE ONLY rodzic
    ADD CONSTRAINT rodzic_pkey PRIMARY KEY (rodzic_id);


-- Completed on 2007-01-02 18:48:37 CET

--
-- PostgreSQL database dump complete
--

--
-- PostgreSQL database dump
--

-- Started on 2007-01-02 18:48:23 CET

SET client_encoding = 'UTF8';
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- TOC entry 1191 (class 1259 OID 45762)
-- Dependencies: 1514 4 1189
-- Name: dziecko; Type: TABLE; Schema: public; Owner: mike; Tablespace:
--

CREATE TABLE dziecko (
    dziecko_id serial NOT NULL,
    ulubione character(10)
)
INHERITS (rodzic);


--
-- TOC entry 1520 (class 0 OID 0)
-- Dependencies: 1190
-- Name: dziecko_dziecko_id_seq; Type: SEQUENCE SET; Schema: public; Owner: mike
--

SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('dziecko', 'dziecko_id'), 3, true);


--
-- TOC entry 1518 (class 0 OID 45762)
-- Dependencies: 1191
-- Data for Name: dziecko; Type: TABLE DATA; Schema: public; Owner: mike
--

INSERT INTO dziecko (rodzic_id, rodzic, rodzic2, dziecko_id, ulubione) VALUES (5, 'dd        ', 'DD        ', 2, '44        ');
INSERT INTO dziecko (rodzic_id, rodzic, rodzic2, dziecko_id, ulubione) VALUES (3, 'cc        ', 'CC        ', 3, 'dziecko   ');


--
-- TOC entry 1517 (class 2606 OID 45767)
-- Dependencies: 1191 1191
-- Name: dziecko_pkey; Type: CONSTRAINT; Schema: public; Owner: mike; Tablespace:
--

ALTER TABLE ONLY dziecko
    ADD CONSTRAINT dziecko_pkey PRIMARY KEY (dziecko_id);


-- Completed on 2007-01-02 18:48:23 CET

--
-- PostgreSQL database dump complete
--

zmienilem nazwy tabel/pol i wprowadzone dane.
misty
zatem zrobilam wg Twojego przykladu:

test=# create table rodzic (rodzic_id serial not null, rodzic char(10) not null, rodzic2 char(10) not
null);
***(Single step mode: verify command)*******************************************
create table rodzic (rodzic_id serial not null, rodzic char(10) not null, rodzic2 char(10) not null);
***(press return to proceed or enter x and return to cancel)********************

NOTICE: CREATE TABLE will create implicit sequence "rodzic_rodzic_id_seq" for serial column "rodzic.r
odzic_id"
CREATE TABLE
test=# insert into rodzic (rodzic_id, rodzic, rodzic2) values (1, 'aa', 'AA');
***(Single step mode: verify command)*******************************************
insert into rodzic (rodzic_id, rodzic, rodzic2) values (1, 'aa', 'AA');
***(press return to proceed or enter x and return to cancel)********************

INSERT 0 1
test=# insert into rodzic (rodzic_id, rodzic, rodzic2) values (2, 'bb', 'BB');
***(Single step mode: verify command)*******************************************
insert into rodzic (rodzic_id, rodzic, rodzic2) values (2, 'bb', 'BB');
***(press return to proceed or enter x and return to cancel)********************

INSERT 0 1
test=# insert into rodzic (rodzic_id, rodzic, rodzic2) values (3, 'cc', 'CC');
***(Single step mode: verify command)*******************************************
insert into rodzic (rodzic_id, rodzic, rodzic2) values (3, 'cc', 'CC');
***(press return to proceed or enter x and return to cancel)********************

INSERT 0 1
test=# alter table rodzic add constraint rodzic_pkey primary key (rodzic_id);
***(Single step mode: verify command)*******************************************
alter table rodzic add constraint rodzic_pkey primary key (rodzic_id);
***(press return to proceed or enter x and return to cancel)********************

NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "rodzic_pkey" for table "rodzic"
ALTER TABLE
test=# select * from rodzic;
***(Single step mode: verify command)*******************************************
select * from rodzic;
***(press return to proceed or enter x and return to cancel)********************

rodzic_id | rodzic | rodzic2
-----------+------------+------------
1 | aa | AA
2 | bb | BB
3 | cc | CC
(3 rows)

test=# create table dziecko (dziecko_id serial primary key not null, ulubione char(10)) inherits (rodz
ic);
***(Single step mode: verify command)*******************************************
create table dziecko (dziecko_id serial primary key not null, ulubione char(10)) inherits (rodzic);
***(press return to proceed or enter x and return to cancel)********************

NOTICE: CREATE TABLE will create implicit sequence "dziecko_dziecko_id_seq" for serial column "dzieck
o.dziecko_id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "dziecko_pkey" for table "dziecko"
CREATE TABLE
test=# insert into dziecko (rodzic_id, rodzic, rodzic2, dziecko_id, ulubione) values (5, 'dd', 'DD', 2 , '44');
***(Single step mode: verify command)*******************************************
insert into dziecko (rodzic_id, rodzic, rodzic2, dziecko_id, ulubione) values (5, 'dd', 'DD', 2, '44') ;
***(press return to proceed or enter x and return to cancel)********************

INSERT 0 1
test=# insert into dziecko (rodzic_id, rodzic, rodzic2, dziecko_id, ulubione) values (3, 'cc', 'CC', 3 , 'dziecko');
***(Single step mode: verify command)*******************************************
insert into dziecko (rodzic_id, rodzic, rodzic2, dziecko_id, ulubione) values (3, 'cc', 'CC', 3, 'dzie cko');
***(press return to proceed or enter x and return to cancel)********************





I TU GENERALNIE TROCHE INNEGO WYNIKU POWINNISMY SIE SPODZIEWAC..
Z TEGO CO ROZUMUJE, NIE POWINNO BYC 3CIEJ KOLUMNY GDYZ JEST ONA WSPOLNA DLA RODZICA I DZIECKA..

INSERT 0 1
test=# select * from only rodzic;
***(Single step mode: verify command)*******************************************
select * from only rodzic;
***(press return to proceed or enter x and return to cancel)********************

rodzic_id | rodzic | rodzic2
-----------+------------+------------
1 | aa | AA
2 | bb | BB
3 | cc | CC
(3 rows)


HMM, TO JAK?
dr_bonzo
Troche mieszasz,
Cytat
NIE POWINNO BYC 3CIEJ KOLUMNY GDYZ JEST ONA WSPOLNA DLA RODZICA I DZIECKA..

Trzeci wiersz (rekord)? Ten z 'ccCC'?

Z tego co zauwazylem (dziedziczeniem w PG zajmuje sie od przeczytania tego posta biggrin.gif)
to
*
  1. SELECT * FROM ONLY rodzic
-- wyswietli rekordy dodawane bezposrednio do tabeli rodzic czyli bez dzieci
*
  1. SELECT FROM rodzic
wyswietli rodzicow i dzieci, bo dzieci SA rodzicami (hiearchia dziedziczenia; nie majaca nic wspolnego z relacjami w rodzinie, po prostu nadklasa i podklasa)
* select z dzieci jest oczywisty


Cytat
Z TEGO CO ROZUMUJE, NIE POWINNO BYC 3CIEJ wiersza GDYZ JEST ONA WSPOLNA DLA RODZICA I DZIECKA..


Nie, powinna sie tam znalezc. Jest i rodzic i dziecko (byly dwa inserty do rodzica i do dziecka) z takimi samymi danymi. Wiec ONLY wyswietli rodzica, a bez ONLY i rodzic i dziecko z takimi samymi danymi sie pojawia

Kod
SELECT * FROM rodzic;
rodzic_id;rodzic;rodzic2
1;aa      ;AA        
2;bb      ;BB        
3;cc      ;CC         // troche to pokrecone -- bo mamu dwa rekordy z tym samym PK :) musze jeszcze o tym poczytac
5;dd      ;DD      
3;cc      ;CC        //


Kod
SELECT * FROM ONLY rodzic;
rodzic_id;rodzic;rodzic2
1;aa      ;AA        
2;bb      ;BB        
3;cc      ;CC


Kod
SELECT * FROM dziecko;
rodzic_id;rodzic;rodzic2;dziecko_id;ulubione
5;dd      ;DD      ;2;44        
3;cc      ;CC      ;3;dziecko



PS. co do uzywania konsoli -- przeciez to zbedny hardcore, poza tym te nieczytelne wydruki z potwierdzeniami polecen :/
misty
dobra. wsjo jasne. w pierwszym poscie dodalam ze nie wykluczam nieprawidlowego toku myslenia.
po prostu myslalam ze " select * from only " pokaze mi tylko to co nalezy do rodzica, bez czesci wspolnej rodzica i dziecka. no a jest tak jak napisales! dzieki za naprowadzenie i przepraszam za tak banalny problem..

ps. co do konsoli, to kurcze co sie tak mnie wszyscy czepiaja;) ja na prawde tak wole.

pzdr!:)
dr_bonzo
Cytat
dzieki za naprowadzenie i przepraszam za tak banalny problem..

Jaki tam banalny, chyba nie widzialas banalnych problemow na tym forum biggrin.gif

Cytat
ps. co do konsoli, to kurcze co sie tak mnie wszyscy czepiaja;) ja na prawde tak wole.

Tylko ja sie czepiam biggrin.gif bo nieuzywajac konsoli nie musze znac skladni tworzenia tabel (za trudna jak dla mnie biggrin.gif), indeksow itd. Liste tabel w bazie i pol mam caly czas wyswietlona, dla mnie to duza wygoda.
OK, juz do niczego cie nie naklaniam smile.gif
misty
a postgresa masz u siebie pod win czy pod linuxem? bo jesil pod tym drugim to bym jeszcze miala male konfiguracyjne pytanko.. biggrin.gif
dr_bonzo
Linux
misty
o swietnie!
wiem ze to nie forum linuxowe (na takich takze szukam z tym problemem pomocy:/) no ale moze a noz ktos bedzie mial pomysl!
mam u siebie: slackware 11.0, php-5.0, apache-1.3, postgresa-8.2
problem jest nastepujacy:
php nie rozumie polecen sqla. tzn. w przypadku prostego skryptu:

<?php

$connection=pg_connect ("host=localhost, port=5432, dbname=baza, user=postgres, password=haslo")
or die ("nie mozna sie polaczyc z baza!");

echo "done!";

?>

wyrzuca mi na stronie:
Call to undefined function pg_connect() in /var/www/htdocs/glowna.php

probowalam dodac na poczatku skryptu: dl('pgsql.so'), ustawiwiszy wczesniej w php.ini enable_so na on oraz przy wylaczonym safe_mode. wtedy do powyzszego komunikatu dostaje jeszcze:

Warning: dl() [function.dl]: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/pgsql.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/pgsql.so: cannot open shared object file: No such file or directory in /var/www/htdocs/glowna.php on line 3

co dziwne jest gdyz "/usr/local/php/lib/php/extensions/ " u mnie wogole nie istnieje. u mnie extension_dir=/usr/lib/php/extensions/

dalej:

znalazlam w dokumentacji php.net taka konfiguracje:

./configure --with-pgsql=/usr/local/pgsql/data --with-apxs=/www/bin/apxs

tudziez:
./configure --with-apxs --with-pgsql=shared

konfiguracja przebiega ok, ale przy # make sie taki problem pojawia:

/usr/local/php/sapi/apache/mod_php5.c:1022: error: syntax error before "application"
/usr/local/php/sapi/apache/mod_php5.c:1024:38: warning: no newline at end of file
make: *** [sapi/apache/mod_php5.lo] Error 1

jak robie: ./configure tylko z pgsql, bez apxs to wsjo ok przechodzi, no ale na stronie nadal 'call to udefined function..'
przekonfigurowalam jeszcze raz apache ./configure --prefix=/www --enable-module=so

ale sytuacja jak powyzej..
masz jakis pomysl? bo juz chyba z 3ci dzien z tym walcze :|
dr_bonzo
Ja robilem (teraz nie uzywam apacha) to tak (dla apacha 1)
pominalem nieistotne parametry, pg mam w niestandardowym miejscu

Kod
./configure --prefix=/software/php --with-apxs=/software/apache-1.3/bin/apxs --with-pgsql=/software/postgresql  --with-pdo-pgsql=/software/postgresql


/software/postgresql to katalog instalacji PG

I korzystalem z PDO nie z pg_connect.


Teraz mam php jako fcgi+ lighttpd (www serwer)
Kod
./configure --prefix=/software/php --enable-fastcgi --enable-force-cgi-redirect --with-pgsql=/software/postgresql  --with-pdo-pgsql=/software/postgresql
-- wlasciwie to samo, i pg_connect() dziala.
misty
w koncu jakos poszlo. wywalilam wszystko i przeprowadzilam instalacje od nowa. i jest si. wszystko sie widzi smile.gif
pzdr i dzieki za pomoc!!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.