03. oktober 2008 - 02:37 Der er 9 kommentarer og
1 løsning

Primary keys i 2 tabeller må ikke være ens.

Hej.

Jeg har et problem som haster rimeligt.
Lad os antage at jeg har 2 tabeller: table1 og table2.

Table1:
===================
=ID=  Lastname  =
===================
=1 =  nielsen    =
=2 =  pedersen  =
===================


Table2:
===================
=ID=  Lastname  =
===================
=3 =  Jørgensen  =
=4 =  Hansen    =
===================


ID(int) er primary key på begge som stiger med +1 hver gang du INSERT'er.

Problemstillingen er:

Jeg vælger f.eks. at køre flg. SQL: "INSERT INTO table1 (Lastname) VALUES ('Damgaard')"

Databasen vil normalt automatisk vælge en primary key på ID med integeren 3.

Hér er det så jeg vil have en slags reverse-relatioship hvor databasen ser at 3 er taget i 'table2' og kan derfor ikke tage denne.
Istedet skal den "se" at næste integer som er ledig er tallet 5.

Forstår i hvad jeg mener?

Det skal selvfølgelig også virke den anden vej således at man aldrig har et id-nummer i de 2 tabeller som er ens.

Håber inderligt i kan hjælpe...


;)Lars
Avatar billede arne_v Ekspert
03. oktober 2008 - 02:43 #1
Lav en tredie tabel kun med IDENTITY felt.

INSERT INTO dummy DEFAULT VALUES;
INSERT INTO tabel1 VALUES(SCOPE_IDENTITY(), 'Damgaard');
INSERT INTO dummy DEFAULT VALUES;
INSERT INTO tabel2 VALUES(SCOPE_IDENTITY(), 'Andersen');
o.s.v.
Avatar billede arne_v Ekspert
03. oktober 2008 - 02:49 #2
Jeg er iøvrigt lidt sketisk overfor om tabel strukturen er den optimale !
Avatar billede teepee Nybegynder
03. oktober 2008 - 08:39 #3
Du kunne også bare pre-/postfixe løbenummeret med 'A' hhv 'B' så bliver de aldrig ens
Avatar billede aaberg Nybegynder
03. oktober 2008 - 08:50 #4
Sæt ID kolonnen i tabellerne til at inkrementere med 2, og sæt identitien i tabell1 til at starte på 1, og i tabell2 at starte med 2. Da vil du få ulige tal (1,3,5,7,osv) som ID i tabell1 og lige tal (2,4,6,8,osv) i tabell2.
03. oktober 2008 - 09:12 #5
Der må da være en smartere måde end de forslag i har givet. Måske hvis man fjerner "incremental" fra ID og bruger en trigger. Jeg kan bare ikke få det til at virke. Arne V. Jeg ved godt det måske ser lidt ulogisk ud, men faktisk kan det bruges til en enorm masse...
Avatar billede aaberg Nybegynder
03. oktober 2008 - 09:41 #6
De fleste andre store databaser har sequence numre i stedet for autoinkrementering, som kan bruges til netop det du skal bruge. Hvis du skal bruge unikke ID'er over flere tabeller i en Sql Sever, anbefaler Microsoft at du bruger GUID's som ID datatype.
Avatar billede teepee Nybegynder
03. oktober 2008 - 10:10 #7
Den pæne løsning vil nok være at oprette en mastertabel som begge tabeller peger på med foreign keys. Men derudover kan nok godt nøjes med at disse nøgler samtidig så er din primærnægler på de to andre tabeller.
03. oktober 2008 - 10:46 #8
teepee, jeg kan godt lide at have orden i tingene og en mastertabel ville klart bringe lidt orden i tingene. men præcis hvordan jeg arbejder i foreign_keys på mssql 2005 er jeg ikke helt klar over. Har du et par gode hints så sig endelig til. Jeg vil flux selv gå igang med at kigge på det...
Avatar billede teepee Nybegynder
03. oktober 2008 - 12:21 #9
ALTER TABLE table1
ADD CONSTRAINT fk_id
FOREIGN KEY (ID)
REFERENCES mastertabel (ID) ON DELETE CASCADE
GO

ON DELETE CASCADE kan udelades

prøv at lave en insert i table1 uden at have indsat en masterrække...
28. maj 2014 - 15:03 #10
lukker
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

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