Avatar billede krimi Nybegynder
16. marts 2001 - 17:29 Der er 6 kommentarer og
1 løsning

fremmed nøgle, hvordan?

Ok, så kommer ugens dumme spørgsmål:

Hvis jeg har to tabeller med hver sin primærnøgle, og jeg oprette en tredie tabel som kommer til at indeholde disse primærnøgler som fremmednøgler, hvordan sikrer jeg mig at den nye tabel bliver opdateret når de gamle tabeller opdateres??

Mvh
Lars
Avatar billede repsac Nybegynder
16. marts 2001 - 18:05 #1
Du skal bruge kommadoen \"CASCADE\" ...

\"CASCADE: Enhver ændring af en primær nøgleværdi bliver også gennetvunget i alle refererende kolonner med fremmednøgler. Hvis f.eks. REFNR for Større ansigtsløftninger ændres fra AN2 til AN3, vil alle rækker i tabellen ADMINISTRATION der har værdien AN2 i REFNR, få værdien ændret til AN3. Hvis Større ansigtsløftning bliver slettet fra tabellen BEHANDLING, vil alle rækker i ADMINISTRATION, der refererer til denne behandling, ligeledes blive fjernet\" (IDG \"Start på SQL\")

Noget lignende:

FORIGN KEY (whatever)
  REFERENCES allsowhatever
  ON UPDATE CASCADE
Avatar billede krimi Nybegynder
16. marts 2001 - 18:31 #2
Hej

Hvis jeg forsøger at tilføje en check constraint der ser således ud:

FOREIGNKEY Mbrugernavn
  REFERENCES brugernavn
  ON UPDATE CASCADE

får jeg fejlen: Incorrect syntax near \'Mbrugernavn\' (også hvis jeg skriver Foreign key)

kan du fortælle mig hvad jeg gør forkert?
Avatar billede torbenkoch Nybegynder
16. marts 2001 - 18:39 #3
CASCADE kan ikke bruges i SQL Server (version 7, mener, at man kan i 2000). Jeg citerer fra Books Online:

\"The Access cascading updates and deletes are not available with SQL Server.\"

Dit problem skal istedet løses med triggers.
Avatar billede krimi Nybegynder
16. marts 2001 - 22:58 #4
Hej igen

Kan du give et forslag til en sådan trigger??

Mvh
Lars
Avatar billede torbenkoch Nybegynder
18. marts 2001 - 12:41 #5
Skal lige høre:

Når du siger \"opdatere den gamle tabel\", er det så indsættelse af nye records du tænker på, eller er det ændring af primærnøglernes værdi (fyfy!)??

Har gået og tænkt lidt over det og det er er vist lidt besværligt - vender tilbage med noget mere senere.
Avatar billede torbenkoch Nybegynder
18. marts 2001 - 13:00 #6
Ok, det ser ud til, at triggers ikke rigtigt kan bruges her - måske hvis man kunne lave triggers på et view, men det kan man ikke...!

Jeg går her ud fra, at det er ved indsættelse af nye records, at den tredje tabel (som jo indeholder mange-mange-relationer mellem de to andre) skal holdes opdateret. Her følger et eksempel på sådan noget:

Vi har to hovedtabeller - t1 og t2, som begge ser sådan ud:

  id  int identity,
  text char(10)

Så har vi en tredje tabel - t1_t2:

  id  int identity,
  t1id int,
  t2id int

For at sikre os, at t1_t2 bliver holdt opdateret, når vi indsætter records i t1_t2 bliver vi nødt til at benytte os af en stored procedure til at indsætte records med:
-----------------------------
create procedure insert_t1_t2
  @t1text char(10),
  @t2text char(10)
as
  declare @t1id int
  declare @t2id int

  insert t1 (text) values (@t1text)
  select @t1id = @@identity from t1

  insert t2 (text) values (@t2text)
  select @t2id = @@identity from t2

  insert t1_t2 (t1id, t2id) values (@t1id, @t2id)
-------------------------------------------------

Dette kan så prøves af med

insert_t1_t2 \"test1\", \"test2\"
select * from t1
select * from t2
select * from t1_t2

Hvis det ikke er dette du skal bruge - eller evt. har fundet en anden løsning, så sig lige til!!
Avatar billede krimi Nybegynder
19. marts 2001 - 10:11 #7
Hej Torben

Tak for svaret.
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