Forum » Programiranje » [SQL] Kako omejiti vrednost med parent in child tabelo?
[SQL] Kako omejiti vrednost med parent in child tabelo?
MrStein ::
Če imamo en foreign key column in en atribut x, kako lahko omejim, da FK vedno kaže na vrstico, ki ima enako vrednost atributa x?
Recimo, če ima žival MOTHER_ID in FATHER_ID kot FK, kako dodatno omejiti, da je CHILD.SPECIES enak PARENT.SPECIES?
Tabela je:
ANIMAL
---------
ID - PK
MOTHER_ID - FK
FATHER_ID - FK
SPECIES - ID vrste (1-lev, 2-tiger, 3-slon, 4-žirafa,...)
AGE
MASS itd...
Torej da ima slon lahko za starše samo druge slone, ne pa tudi leve?
Gre se za Oracle, lahko pa tudi splošno.
Recimo, če ima žival MOTHER_ID in FATHER_ID kot FK, kako dodatno omejiti, da je CHILD.SPECIES enak PARENT.SPECIES?
Tabela je:
ANIMAL
---------
ID - PK
MOTHER_ID - FK
FATHER_ID - FK
SPECIES - ID vrste (1-lev, 2-tiger, 3-slon, 4-žirafa,...)
AGE
MASS itd...
Torej da ima slon lahko za starše samo druge slone, ne pa tudi leve?
Gre se za Oracle, lahko pa tudi splošno.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
- spremenil: MrStein ()
Tody ::
Rabiš vmesno tabelo ali view ena proti mnogo rabi vedno to. V tabeli poveš katere vrste so starši. Tako boš dobil spisek vseh slonov, kdo je od koga otrok pa potem z queryiem.
MrStein ::
Lahko malo bolj podrobno?
PS: Ena možnost pa so seveda trigger-ji.
PS: Ena možnost pa so seveda trigger-ji.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Tody ::
Jah foren key so uporabni samo ko se vežejo na tuje tabele :) Oz vezne tabele... Torej moreš imeti tabelo starši, kjer boš povedal povezavo med mamo slonico in sinčkom, oba imata unikatna ID-ja, ampak sinček bo mel tuji ključ še od mame in ata.
Potem pa ko delaš query boš imel vzpostavljeno hirarhijo.
Potem pa ko delaš query boš imel vzpostavljeno hirarhijo.
WarpedGone ::
kako lahko omejim, da FK vedno kaže na vrstico, ki ima enako vrednost atributa x?
Ne moreš, ne z referenčno integriteto.
FK pomeni foreign key in dobesedno pomeni: vrednosti v tem stolpcu so lahko samo vrednosti primarnega ključa neke (običano druge) relacije, v tvojem primeru kaže na isto relacijo (kar je OK). Preverja se samo konkretne stolpce FK, ne pa še kake druge zraven.
Trigger je najbolša šansa ampak te zna ugriznit ORAxxx: Table is mutating, trigger might not see it. So pristopi, kako pridit mimo tega.
Tle morajo trije s FKji povezani zapisi v isti tabeli vedno imeti enako vrednost v nekem stolpcu X.
Priporočam proceduralno rešitev, kjer maš ustrezne kontrole vgrajene v postopek, ki fila tabelo - upam da je to PLSQL koda in ne nek insert v neki client aplikaciji.
Zbogom in hvala za vse ribe
MrStein ::
Jah foren key so uporabni samo ko se vežejo na tuje tabele
Uporabni so tudi za isto tabelo. Preverjeno.
WarpedGone je izjavil:
kako lahko omejim, da FK vedno kaže na vrstico, ki ima enako vrednost atributa x?
Ne moreš, ne z referenčno integriteto.
Pred tedni sem nekje na StackExchange bral podobno vprašanje in je rešitev bila z FK-ji (ali nekaj podobnega), se pa ne spomnim detajlov oziroma ne najdem več tega članka...
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Zgodovina sprememb…
- spremenil: MrStein ()
klemenSLO ::
S CHECK Constrainti tudi lahko kontroliraš vrednosti glede na povezano tabelo:
recimo:
http://stackoverflow.com/questions/3880...
recimo:
http://stackoverflow.com/questions/3880...
Life is not measured in minutes, but in MOMENTS...
MrStein ::
Super, tam je tudi primer z FK (manj kode, bolj elegantno).
Hvala.
Hvala.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | oracle 12 identity (the old way)Oddelek: Programiranje | 1059 (864) | detroit |
» | SQL Parent key not foundOddelek: Programiranje | 1060 (983) | Ciklamen |
» | Podatkovna baza - foreign keyOddelek: Programiranje | 612 (529) | abyssus |
» | Baze ter relation med njimiOddelek: Programiranje | 3334 (2895) | Marat |
» | Access- relacijeOddelek: Programiranje | 1935 (1776) | ghost |