Jei nepavyko į lentelę įterpti naujo įrašo dėl unikalaus apribojimo, nepamirškite perskaityti šio straipsnio. Tai padės jums išspręsti šią problemą.
Šiame straipsnyje pristatysime 4 būdus, kaip išspręsti problemą, kai nepavyksta įterpti naujo įrašo, nes jis pažeidžia unikalų lentelės apribojimą SQL Server.
Tikras atvejis:
Dabar pažiūrėkime tikrą atvejį. Turime duomenų bazę pavadinimu „Produktas“ ir lentelę pavadinimu „DataNumenProduktas“ duomenų bazėje. Lentelėje yra du laukai, ty „ProductId“ ir „ProductName“, kurių duomenų tipai yra atitinkamai „int“ ir „varchar“. O „ProductId“ yra pagrindinis raktas su unikaliu apribojimu.
Šiuo metu lentelėje yra keletas įrašų, kaip nurodyta toliau:
1 pav. Įrašai lentelėje “DataNumenProduktas“
Darant prielaidą, kad yra dvi duomenų bazės DBA, ty Jimas ir Tomas. Vieną dieną Jimas ištrynė pirmąjį lentelės įrašą, kaip nurodyta toliau:
DELETE FROM DataNumenProduct WHERE ProductId=1;
Antrą dieną Tomas į lentelę įdėjo naują įrašą, kuriame yra tas pats pirminis raktas su ištrintu įrašu, kaip nurodyta toliau:
INSERT INTO DataNumenProduct VALUES(1,'DataNumen OutLook Repair');
Taigi mūsų lentelėje yra šie įrašai, kaip nurodyta toliau:
2 pav. Atnaujinti įrašai lentelėje “DataNumenProduktai"
Dabar, jei Jimas norės atkurti ištrintą įrašą atgal į lentelę, tai pažeis unikalų pirminio rakto „ProductId“ apribojimą. Tokiu atveju problemai išspręsti galime naudoti vieną iš toliau pateiktų sprendimų.
1 sprendimas: pakeiskite pagrindinį naujo įrašo raktą, kad išvengtumėte konflikto
Galime pakeisti pirminį įrašo raktą, kuris turi būti įterptas, į naują reikšmę, kuri skiriasi nuo visų esamų lentelės įrašų. Kaip pavyzdį paimkite aukščiau pateiktą atvejį, kad įrašas būtų įterptas, mes galime pakeisti pirminio rakto reikšmę nuo 1 iki 5. Tada galime atkurti naują sugeneruotą įrašą atgal į lentelę, kaip nurodyta toliau:
INSERT INTO DataNumenProduct VALUES(5, 'DataNumen Access Repair');
Žemiau pateikiami galutiniai rekordai lentelėje:
3 pav. Galutiniai įrašai lentelėje “DataNumen Produktai"
2 sprendimas: pakeiskite pagrindinį esamo įrašo raktą, kad išvengtumėte konflikto
- Pirmiausia turime atnaujinti esamo įrašo pirminio rakto reikšmę, dėl kurios gali kilti konfliktas, kaip nurodyta toliau:
UPDATE DataNumenProduct SET ProductId = 6 WHERE ProductId = 1;
Toliau pateikiami atnaujinti įrašai lentelėje:
4 pav. Atnaujinti įrašai lentelėje “DataNumen Produktai"
- Tada galime atkurti ištrintą įrašą atgal į lentelę, kaip nurodyta toliau:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair ');
Dabar pažiūrėkime galutinę versiją, kaip nurodyta toliau:
5 pav. Galutiniai įrašai lentelėje “DataNumen Produktai"
3 sprendimas: laikinai išjunkite unikalų apribojimą per SQL
- Norėdami išspręsti problemą, laikinai lentelėje galime ištrinti pirminio rakto apribojimą „pk“, kaip nurodyta toliau:
ALTER TABLE DataNumenProduct DROP CONSTRAINT pk;
- Tada mes galime pridėti ištrintą įrašą į lentelę, kaip nurodyta toliau:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Dabar pažiūrėkime įrašus lentelėje:
6 pav. Atnaujinti įrašai lentelėje “DataNumen Produktai"
- Tada, kadangi du įrašai turi tas pačias pirminio rakto reikšmes, vieną iš jų turime modifikuoti, kad išvengtume konflikto, kaip nurodyta toliau:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Galiausiai į lentelę įtraukiame pirminio rakto apribojimą „pk“, kaip nurodyta toliau:
ALTER TABLE DataNumenProduct ADD CONSTRAINT pk PRIMARY KEY(ProductId);
Dabar lentelėje yra keletas įrašų, kaip nurodyta toliau:
7 pav. Atnaujintas turinys lentelėje “DataNumen Produktai"
4 sprendimas: laikinai išjunkite unikalų apribojimą per SQL Server Valdymo studija:
- Pirmiausia ištriname pirminio rakto apribojimą „pk“ lentelėje per GUI, kaip nurodyta toliau:
8 pav. Ištrinkite pagrindinio rakto apribojimą „pk“ per GUI
- Tada ištrintą įrašą realiuoju atveju įterpiame į lentelę, kaip nurodyta toliau.
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Dabar lentelėje yra keletas įrašų, kaip nurodyta toliau:
9 pav. Atnaujintas turinys lentelėje “DataNumen Produktai"
- Tada mes modifikuojame esamo įrašo pirminio rakto reikšmę lentelėje, kaip nurodyta toliau:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Galiausiai į lentelę per GUI pridedame pirminio rakto apribojimą „pk“, kaip nurodyta toliau:
8 pav. Sugrąžinkite pirminio rakto apribojimą „pk“ per GUI
Išspręsti SQL Server Duomenų bazių korupcija
Išskyrus unikalius apribojimus, SQL Server korupcija taip pat labai dažna problema, erzinanti DBA. Paprastai galime naudoti SQL Server įmontuotos komandos gedimams išspręsti. Tačiau jei jie neveikia, galime kreiptis į kokią nors trečiąją šalį SQL Server duomenų atkūrimo įrankiai.
Autoriaus įvadas:
Jimas Hu yra duomenų atkūrimo ekspertas DataNumen, Inc., kuri yra pasaulyje duomenų atkūrimo technologijų lyderė, įskaitant Prieigos remontas bei dbf programinės įrangos gaminių taisymas. Norėdami gauti daugiau informacijos, apsilankykite WWW.datanumen.com








