Avatar billede laurits Nybegynder
18. maj 2003 - 12:20 Der er 13 kommentarer og
1 løsning

Problemer med Navnesammenfald

Jeg er ved at oprette nogle tabeller, hvor primær nøglen, bruges som fremmednøgle i to andre tabeller.
Men det giver navnesammenfald i Oracle. Hvordan løser man det problem?
Skal man angive tabelnavn foran?
Avatar billede soreno Praktikant
18. maj 2003 - 12:23 #1
Med SQL kan man gøre sådan:

SELECT tabel1.navn, tabel2.by, tabel2.navn
WHERE tabel1.id = tabel2.id
Avatar billede laurits Nybegynder
18. maj 2003 - 12:27 #2
Du mener så at tabel1 er hvor Primær nøglen oprettes?
Avatar billede soreno Praktikant
18. maj 2003 - 12:45 #3
Se f.eks. dette (lidt mere konkrete konstruerede eksempel):

Tabel1
  telefonnr
  navn
  postnr

Tabel2
  id
  telefonnr
  firma

Tabel3
  id
  telefonnr
  teleselskab

SELECT Tabel1.navn, Tabel1.telefonnr, Tabel2. firma, Tabel1.postnr, Tabel3.teleselskab
WHERE Tabel1.telefonnr = Tabel2.telefonnr AND Tabel2.telefonnr = Tabel3.telefonnr;

Navnesammenfald undgåes ved at prefixe med tabelnavn.
(Har jeg forstået dit problem korrekt ?)
Avatar billede pgroen Nybegynder
18. maj 2003 - 12:50 #4
Du kan enten gøre som soreno har beskrevet ovenfor,
eller bruge tabel-aliaser:

SELECT
  t1.navn, t2.by, t2.navn
FROM
  tabel1 t1, tabel2 t2
WHERE t1.id = t2.id

og / eller sørge for at navnene på nøglerne er unikke:
(også for at gøre statementet mere forståeligt...)

SELECT
  t1.navn, t2.by, t2.navn
FROM
  tabel1 t1, tabel2 t2
WHERE t2.tabel1_id = t1.id

- i det ovenstående eksempel vil tabel1_id typisk være
tabel2's fremmednøgle mod tabel1
Avatar billede laurits Nybegynder
18. maj 2003 - 12:54 #5
Både ja og nej
Jeg ved ikke lige hvordan jeg skal forklare det.
Jeg skal oprette nogle constraints for at undgå navnesammenfald
Avatar billede laurits Nybegynder
18. maj 2003 - 13:00 #6
Jeg har en Tabel 'Movie' I tabellen er der en MOVIE-ID som er primær nøgle.
I en tabel 'Movie_Copy' er der også en MOVIE-ID, der skal være fremmed nøgle, som referer til MOVIE tabellen.
Det kan gøres med constraints.
Avatar billede pgroen Nybegynder
18. maj 2003 - 13:13 #7
Øhm, dine problemer med navnesammenfald har ikke noget med dine constraints at gøre (?)

fx.

CREATE TABLE  table1 (ID NUMBER NOT NULL);

ALTER TABLE table1 ADD (CONSTRAINT t1_pk PRIMARY KEY (ID));

CREATE TABLE table2 (ID NUMBER NOT NULL, table1_id NUMBER);

ALTER  TABLE table2 ADD (CONSTRAINT t2_pk PRIMARY KEY (ID));

ALTER TABLE table2 ADD (CONSTRAINT t2_fk FOREIGN KEY (table1_id)
                        REFERENCES table1 (ID));


- I dit eksempel vil man joine som følger:
.
.
.
WHERE
  movie_copy.movie_id = movie.movie_id
.
.
.
Avatar billede laurits Nybegynder
18. maj 2003 - 13:27 #8
Jeg mente ellers denne sætning skulle gøre det. Men med det du skriver ,pgroen så passer det ikke helt sammmen.
ADD CONSTRAINT MOVIE_COPY.MOVIE_ID FOREIGN KEY (MOVIE_ID) REFERENCES MOVIE (MOVIE_ID)
Avatar billede pgroen Nybegynder
18. maj 2003 - 14:36 #9
Aha - der lå hunden begravet !

Du blander constraint-navn og kolonne-navn sammen;

man kan godt have to tabeller med samme kolonne-navne
- men man kan IKKE have to constraints med samme navn,
selv om de hører til hver sin tabel...

så jeg ville nok skrive:

ADD CONSTRAINT MOVIE_COPY.MOVIE_FK FOREIGN KEY (MOVIE_ID) REFERENCES MOVIE (MOVIE_ID)

- Det er ikke nogen god ide at kalde din constraint det samme som din kolonne;
det skaber unødig forvirring...:-)
Avatar billede laurits Nybegynder
18. maj 2003 - 16:38 #10
Nu er jeg lidt forvirret.
Dit eksempel virker fint så det er kanon.
Men hvad er hvad?
MOVIE_COPY.MOVIE_FK    = navnet på constraint'en
1. (MOVIE_ID)          = kolonnen i tabellen MOVIE_COPY
REFERENCES MOVIE (MOVIE_ID) = refererer til MOVIE_ID i tabellen MOVIE
Er det rigtigt forstået?
Avatar billede pgroen Nybegynder
18. maj 2003 - 16:58 #11
Yessir !
Det er rigtig forstået :-)

Noget helt andet er :

Hvis du har fået blod på tanden, så prøv at få at få dig en (gratis) account hos Oracle's TechNet;
Der er den fulde dokumentation tilgængelig, fx. 'SQL Rererence Guide'

http://otn.oracle.com/pls/db92/db92.docindex

Hvor der bl.a. også er lidt snak om constraints:

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/clauses3a.htm#998196
Avatar billede laurits Nybegynder
18. maj 2003 - 17:03 #12
Okay du er jo virkelig ved at tjent dine 200 point, din Oracle guru  :-)
Dagens sidste spg.
Jeg fik bare af vide jeg godt kunne have flere constraints, med samme navn.  Hvis jeg bare satte navnet på tabellen foran (tabellen, hvor de blev oprettet), adskilt med punktum.
Men det er måske ikke rigtigt??
Avatar billede pgroen Nybegynder
18. maj 2003 - 18:06 #13
Nej og Ja

Man KAN faktisk godt navngive en constraint med ".", men så skal den i anførselstegn, og det er absolut IKKE en fremgangsmåde jeg vil anbefale...

For nu at opsummere:

CREATE TABLE  table1 (ID NUMBER NOT NULL);

CREATE TABLE  table2 (ID NUMBER NOT NULL);

ALTER TABLE table1 ADD (CONSTRAINT dumt_constraint_navn PRIMARY KEY (ID));

ALTER TABLE table2 ADD (CONSTRAINT dumt_constraint_navn PRIMARY KEY (ID));

ERROR at line 1:
ORA-02264: name already used by an existing constraint

ALTER TABLE table2 ADD (CONSTRAINT table2.dumt_constraint_navn
                        PRIMARY KEY (ID))
                                        *
ERROR at line 1:
ORA-00904: : invalid identifier

ALTER TABLE table2 ADD (CONSTRAINT "table2.dumt_constraint_navn"
                        PRIMARY KEY (ID));
Table altered.


-Men som sagt, det er IKKE klogt at gøre sådan noget !
Avatar billede laurits Nybegynder
18. maj 2003 - 19:41 #14
Du har ret, det kan lade sig gøre. Det er fantastisk.
Du er en sand Oracle guru.
Men taget til efterretning, det er ikke et klogt valg. Jeg vil nok lige overveje opbygningen af tabellerne endnu engang.
Men point'ene har du sgu fortjent.  :-)
Tak for hjælpen og for linket til Oracle account. Det vil jeg benytte.
Laurits.
(Håber jeg kan fange dig en anden gang hvis det bliver nødvendigt)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester