03. februar 2003 - 00:21Der er
12 kommentarer og 1 løsning
Fortsæt INSERT efter Violation of PRIMARY KEY
Sikkert et simpelt problem, men jeg kan ikke se lyset..
I en sp indsætter jeg en masse rækker i en tabel ud fra indholdet af en cursor. Da nogle af rækkerne allerede findes i destinationstabellen, afbrydes proceduren med "Violation of PRIMARY KEY constraint". Derved bliver resten af rækkerne ikke indsat i dest.tabellen. Hvordan undgår jeg dette. Der skal selvfølgelig ikke indsættes dubletter.
DECLARE New_Cursor CURSOR FOR SELECT * FROM Table1 WHERE Dato >= [en dato]
OPEN New_Cursor
FETCH NEXT FROM New_Cursor INTO @Felt1,@Felt2,@Felt3
IF @@FETCH_STATUS = 0 INSERT INTO Table2 VALUES (@Felt1,@Felt2,@Felt3)
WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM Newdata_Cursor INTO Felt1,@Felt2,@Felt3 INSERT INTO Table2 VALUES (@Felt1,@Felt2,@Felt3) END
Jeg har et udklip fra en procedure jeg bruger - måske kan den lede dig på rette spor.
INSERT INTO tblToolNbrs(fldRegNbr, fldRecycle, fldRecycleText, fldAddDate, fldAddBy) SELECT fldRegNbr, fldRecycle, fldRecycleText, fldAddDate, fldAddBy FROM tblTempNbrs WHERE fldRegNbr NOT IN (SELECT fldRegNbr FROM tblToolNbrs)
Det er vel det sædvanlige, indput validering. Husk altid at checke om rækken eksisterer i forvejen ellers er der ingen grund til at have en primær nøgle. Prøv lidt a la det hugopedersen foreslår.
Nu ved jeg ikke hvordan et MS-produkt klarer det, men en Oracle database ville ikke have noget problem med lige først at validere input, også selvom det var flere 100.000 records vi snakker om.
Det er klart at enhver server bruger ressourcer på validering, også Oracle (måske ikke helt så mange *S*), men der er nu en anden smart måde at klare det på, på en MSSQL :O)
janus 007> Har du en løsning og fisker efter flere points eller hvad? Det kan du da godt få, men skal jeg så oprette et nyt spørgsmål eller hvordan? Primary er nødvendigt da der absolut ikke må forekomme dubletter (ikke kun i denne forbindelse) og det jeg savner er en mulighed for at MSSQL bare skipper indsætning af dubletter og så ellers fortsætter med de andre poster.
janus 007> Jeg gav oprindeligt 30 point fordi jeg troede at det var et simpelt spørgsmål som jeg bare ikke kendte svaret på. Du får da bare 100 ekstra ,så'n skal det ikke heller ikke være. Grunden til at jeg bruger en cursor er at jeg troede at jeg netop kunne undgå dette problem ved at behandle een post ad gangen. Jeg var da helt sikker på at det ville give problemer hvis jeg forsøgte at indsætte hele sættet på een gang. Og kom så med det svar :o)
Jeg ville nok hoppe tilbage til INSERT INTO herefter. Du fravælger primary key i tabeldesign, går ind under 'Manage Indexes' (højreklik på tabellen), vælg den Column som du hidtil havde din primary på. Under Index options vælger du Unique values og Ignore duplicate values!! Det skulle klare sagen, hvis du ikke har behov for noget andet clustered index på andre columns, så sæt flueben i den option ligeledes :O)
janus 007> Jeg prøver lige om det også fungerer når min primary dækker 5 kolonner. Kan man ikke kun have 1 clustered index? Jeg tror det her er vejen, med mindre det går helt ad h... til, opretter jeg et nyt spørgsmål med 100 ekstra til dig.
Jo der kan kun være et clustered index på en tabel!. Hvis din primary dækker over så mange burde du måske over at nornmaliserer noget mere.
Men hvis det ikke er strengt nødvendigt kan du jo bare lade være med at lave et clustered index :O) (ingen steder der står at det er en nødvendighed, men bare en god idé)
janus 007> Din idé var rigtig god og den virker..desværre bare ikke for mig! Det jeg forsøger er at indsætte i en tabel på en linked server og i det tilfælde fungerer dette bare ikke :o( Der kommer, som forventet, en "Duplicate key was ignored.", men *ingen* rækker indsættes overhovedet. På en identisk tabel på samme server, fungerer alt som forventet, dubletter springes over og alle andre indsættes. Dette vil jeg betragte som en bug og skal selvfølgelig ikke gå ud over dig, så jeg opretter et "point til janus 007"- spørgsmål med de 100 point. Med mindre du også har en løsning på det her og vil 200 point mere (lokke,lokke) tror jeg at jeg starter med at slette dubletterne i destinationstabellen inden jeg forsøger at indsætte dem.
Synes godt om
Ny brugerNybegynder
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.