[SQLite] Ako se promijeni neki od podataka u redu

Imam problem jedan.
Imam ovakvu bazu, pojednostavljena je, sa nekim podacima
ID | potomak | otac | majka
1_____X ______Y _____Z
2 Z______A B

Znači u principu, potomak ima oca i majku, ta majka isto ima oca i majku, no to su njihove šifre, ne imena.
I recimo netko se zabunio i mora editirati majka=Z i stavi da je majka=W, odnosno da ima tu drugu šifru
Red 1, stupac majka se promijanio iz Z u W, ali ta majka je ista i dalje ima istog oca i majku, odnosno njhive šifre, no u 2. redu ima oznaku Z.

Kako da napravim da kada izmjeni podatak majka u prvom redu da se promjena dogodi i u 2. redu ili bilo kojim redovima gdje se nalazi ta majka sa prvobitnom oznakom Z.

Foreign key - Wikipedia, the free encyclopedia ?

ovdje je možda bolje objašnjeno:
SQL FOREIGN KEY Constraint

Bah, ne mogu editirati post.
Morao bi imati još jedno polje u bazi, šifra.

ID | --potomak-- | —otac— | --majka-- | --šifra-- |
1_____pot_ID_______ota_ID_____maj_ID______Z____

Ovi pot_ID, ota_ID i maj_ID bi bili foreign keyevi koji bi se odnosili na ID (koji je unique) osobe koja je u pitanju.

ID | potomak | otac | majka | šifra |
1______2______3_____4______Z
2______4______5_____6______X

Ovako bi ti izgledala popunjena tablica:
osoba koja ima ID 1 (a čija šifra je Z) ima potomka sa ID-jem 2 (čija šifra je X).

I sad, ako promjeniš vrijednost šifre za ID 2, i dalje ti u tablici stoji da ID 1 ima potomka s ID-jem 2.

Kad ovako dizajniraš bazu, ispada da ti je polje potomak sasvim suvišno.
Prvo, imaš problem kako upisati ako netko ima 2 potomka.
Drugo, jednostavnim upitom možeš provjeriti tko sve ima određeni ID u polju otac i tako dobiješ potomke te osobe.
(Da bi dobio baš sve potomke nekog ID-a, trebao bi provjeriti tko sve ima taj ID i u polju majka, možda je isti ID nekome otac, a nekome majka, ako je u međuvremenu promjenio spol)

I treće, izbjegavaš grešku, koju sam napravio u ovom primjeru.
Greška je u tome da sam naveo pod ID 1 da mu je potomak onaj sa ID 2.
To bi značilo da sam u ID 2 trebao navesti ID 1 ili kao oca ili kao majku, a nisam.

Hvala, proučit ću to još

Pitanje još jedno, jel bi mogao napraviti nešto sa Triggers. Recimo da kada se izmjeni neko polje da pogleda gdje u tablici ima neko polje sa istim podatkom pa da ga izmjeni?

Naravno da bi mogao.
Ovdje ti je odlično vizualno prikazana sintaksa triggera: SQLite Query Language: CREATE TRIGGER

Mislim da ćeš već pomoću prvog primjera uspjeti složiti ono što ti treba.

ps - nije se još nitko javio tko zapravo zna raditi s bazama :slight_smile:
ja sam tek počeo učiti osnove dizajniranja baze (relacionih modela) i ne znam napamet složiti ni jedan upit :slight_smile:

Aj da probam pomoći. Polje potomak ti je viška. Imaš polje ID i to je identifikator reda.
Znači osoba sa ID=1 ima oca i majku. Polja otac i majka u isto IDjevi koji pokazuju na druge redove u istoj tablici.
Znači ono što trebaš je struktura tipa: ID, ime osobe, otac_id, majka_id.

Da bi napravio automatski update redova prva stvar je da ti tablica mora biti tipa InnoDB, a ne MyISAM. Razlog - MyISAM ne podržava referncijalni integritet.

SQL za kreiranje tablice je ovaj:

CREATE TABLE IF NOT EXISTS table1 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
ime VARCHAR(200) NOT NULL ,
otac_id INT UNSIGNED NOT NULL ,
majka_id INT UNSIGNED NOT NULL ,
PRIMARY KEY (id) ,
INDEX FK_otac (otac_id ASC) ,
INDEX FK_majka (majka_id ASC) ,
CONSTRAINT FK_otac
FOREIGN KEY (otac_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT FK_majka
FOREIGN KEY (majka_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE)
ENGINE = InnoDB;

Dio koji se brine za automatski update redova je ovaj:
CONSTRAINT FK_otac
FOREIGN KEY (otac_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT FK_majka
FOREIGN KEY (majka_id )
REFERENCES table1 (id )
ON DELETE SET NULL
ON UPDATE CASCADE

Ovime ti govoriš sistemu da polje ‘otac_id’ pokazuje na polje ‘id’. u slučaju brisanja nekog reda sistem će sam u redu gdje u polju ‘otac’ postoji taj ID vrijednost tog polja postaviti na NULL budući više ne pokazuje na ništa (ON DELETE SET NULL)
U slučaju da netko promjeni ID nekog reda sistem će automatski napraviti update svih redova gdje je stari ID u polju otac i postaviti će novi ID u polje otac (ON UPDATE CASCADE).

Nadam se da ti je ovo pomoglo.


Copyright © 2022 WM Forum - AboutContact