Avatar billede hnteknik Novice
11. december 2009 - 23:28 Der er 11 kommentarer og
1 løsning

Violation of PRIMARY KEY constraint i reonstructed tabel, men der er ingen dubletter

En større tabel er blevet reconstructed /repareret af en ældre tabel og stumper vha Data compare.

Tabellen tillader nu ikke at man tilføjer nye records:

Violation of PRIMARY KEY constraint 'PK_tblArt'. Cannot insert duplicate key in object 'tblStones'.


Tabellen ser kort sådan ud:

CREATE TABLE [dbo].[tblStones](
..
    [StoneAdded] [datetime] NULL CONSTRAINT [DF_tblStones_StoneAdded]  DEFAULT (getdate()),
..
CONSTRAINT [PK_tblArt] PRIMARY KEY CLUSTERED
(
    [StoneID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


Der er et fremmede nøgler:
ALTER TABLE [dbo].[tblStones]  WITH NOCHECK ADD  CONSTRAINT [FK_tblStones_tblArtists] FOREIGN KEY([StoneArtistID])
REFERENCES [dbo].[tblArtists] ([ArtistID])
GO
ALTER TABLE [dbo].[tblStones] CHECK CONSTRAINT [FK_tblStones_tblArtists]
GO
ALTER TABLE [dbo].[tblStones]  WITH NOCHECK ADD  CONSTRAINT [FK_tblStones_tblStoneCategory] FOREIGN KEY([StoneCategoryID])
REFERENCES [dbo].[tblStoneCategory] ([StoneCategoryID])
GO
ALTER TABLE [dbo].[tblStones] CHECK CONSTRAINT [FK_tblStones_tblStoneCategory]
----------

SELECT StoneID,  count(*) as antal
FROM [dbo].[tblStones]
GROUP BY StoneID
HAVING count(*) > 1

Giver ingen dubletter. Jeg har prøvet at rekonstruere nøgle uden problemer. Forslag til løsning søges.
Avatar billede Syska Mester
11. december 2009 - 23:36 #1
Det lader jo til at være en anden key den brokker sig over:
PK_tblArt

Altså ... en PK i en tblArt ... altså en key du referer i din tblStones ....

// ouT
Avatar billede janus_007 Nybegynder
11. december 2009 - 23:49 #2
Du har null values i StoneId ! Fjern dem og det vil virke :)
Avatar billede terry Ekspert
12. december 2009 - 10:12 #3
SELECT StoneID,  count(*) as antal
FROM [dbo].[tblStones]
GROUP BY StoneID
HAVING count(*) > 1

Giver ingen dubletter. ....

Thats because duplicate records are being rejected
Avatar billede hnteknik Novice
12. december 2009 - 11:16 #4
>Buzzz 'Violation of PRIMARY KEY constraint 'PK_tblArt'.' Pk_tblArt er jo primary, >> CONSTRAINT [PK_tblArt] PRIMARY KEY CLUSTERED ([StoneID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Noget forhindrer den i at danne et nyt stoneID og noget kunne tyde på, at det er en fremmed nøgle som ikke er ok, selvom den klager over primary. Et par andre tabeller er også bevet renset.

Jeg har checket, at der ingen fremmed nøgler er, som ikke er i de fremmede tabeller.

Jeg har prøvet at refreshe pri, key, men jeg vil lige prøve at genopbygge nøglen fra bunden, altså fjerne alt og genskabe nøgler- så skulle den brokke sig. Der skulle være identity incremental på
[StoneID] [int] IDENTITY(1,1) NOT NULL,
Avatar billede hnteknik Novice
12. december 2009 - 11:33 #5
Ha - nu kom jeg ned til bunden af problemet, nu skal jeg blot lige have fundet løsningen.

Indenty inc. fortsætter hvor den gamle backup sluttede 973 +1, men hvor den rekonstruerede er nået til 1374 - 974 eksisterer. Deraf problemet.

Hvordan får jeg den nemmest reseeded, når den nu er fyldt med huller?
Avatar billede hnteknik Novice
12. december 2009 - 11:51 #6
Dette må vist være løsningen:

/* Get current Max Value and reseed table */
DECLARE @MaxID INT
SELECT @MaxID = MAX(StoneID)
FROM tblStones
DBCC CHECKIDENT('tblStones', RESEED, @MaxID)
GO
Avatar billede hnteknik Novice
12. december 2009 - 11:58 #7
Det var løsningen:

Checking identity information: current identity value '974', current column value '1345'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Det der undrer mig er, at et dyrt program som
Red Gate Data Compare Pro - ikke lige har styr på den del.
Avatar billede terry Ekspert
12. december 2009 - 12:59 #8
"Det der undrer mig er, at et dyrt program som
Red Gate Data Compare Pro - ikke lige har styr på den del."

If you think they have a problem then maybe drop them an email
Avatar billede hnteknik Novice
12. december 2009 - 15:07 #9
Hi Terry - I certainly will
Avatar billede janus_007 Nybegynder
12. december 2009 - 22:11 #10
Endnu en god grund til aldrig at bruge identity columns *GG*, en ting jeg altid har fortalt aspiranter :) Det er sku det arveste gejl MS nogensinde har fundet på!
Avatar billede ChrisAu Nybegynder
21. december 2009 - 16:37 #11
Hello,

I'm not sure if you've attempted to contact Red Gate about this yet, but what you have described is a known issue with SQL Data Compare 8.

The problem was that we were setting an option to automatically reseed identity columns, but if you were not performing a complete sync, the values for the reseed could be incorrect.

I apologise for this, but we now have a patch version that fixes this issue.

The changes we have made are:

1) The option is now deselected by default
2) Instead of performing a DBCC CHECKIDENT( reseed, <explicit value>) it now leaves the explicit value out, which means that the value is set to something sensible, rather than something which may cause incorrect inserts later on.

If you would like to try the patch, you can download it from the following location:
<http://www.red-gate.com/messageboard/viewtopic.php?t=9880>

I hope this helps,

Kind regards,

Chris
Red Gate Software Technical Support
Avatar billede hnteknik Novice
04. januar 2010 - 22:24 #12
Thanks Chris
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