Se non sei riuscito a inserire un nuovo record in una tabella a causa del vincolo univoco, non perdere la lettura di questo articolo. Ti aiuterà a risolvere questo problema.
In questo articolo, introdurremo 4 metodi per risolvere il problema quando non riesci ad inserire un nuovo record perché viola il vincolo univoco della tabella in SQL Server.
Un caso reale:
Ora vediamo un caso reale. Abbiamo un database chiamato "Prodotto" e c'è una tabella chiamata "DataNumenProdotto” nel database. Nella tabella sono presenti due campi, ovvero "ProductId" e "ProductName", con tipi di dati rispettivamente di "int" e "varchar". E "ProductId" è una chiave primaria con vincolo univoco.
Attualmente ci sono alcuni record nella tabella, come di seguito:
Figura 1 Record in tabella “DataNumenProdotto"
Supponendo che ci siano due DBA per il database, cioè Jim e Tom. Un giorno, Jim ha cancellato il primo record nella tabella, come di seguito:
DELETE FROM DataNumenProduct WHERE ProductId=1;
Il secondo giorno, Tom ha inserito un nuovo record nella tabella, che ha la stessa chiave primaria con il record eliminato, come di seguito:
INSERT INTO DataNumenProduct VALUES(1,'DataNumen OutLook Repair');
Quindi la nostra tabella ha i seguenti record, come di seguito:
Figura 2 Record aggiornati nella tabella “DataNumenProdotti"
Ora, se Jim desidera ripristinare il record eliminato nella tabella, violerà il vincolo univoco della chiave primaria "ProductId". In tal caso, possiamo utilizzare una delle soluzioni alternative di seguito per risolvere il problema.
Soluzione alternativa 1: modificare la chiave primaria del nuovo record per evitare conflitti
Possiamo modificare la chiave primaria del record da inserire con un nuovo valore diverso da quelli di tutti i record esistenti nella tabella. Prendiamo il caso precedente come esempio, per il record da inserire, possiamo modificare il valore della chiave primaria da 1 a 5. Quindi possiamo ripristinare il nuovo record generato nella tabella, come di seguito:
INSERT INTO DataNumenProduct VALUES(5, 'DataNumen Access Repair');
Di seguito sono riportati i record finali nella tabella:
Figura 3 Record finali nella tabella “DataNumen Prodotti"
Soluzione alternativa 2: modificare la chiave primaria del record esistente per evitare conflitti
- Innanzitutto, dobbiamo aggiornare il valore della chiave primaria del record esistente che potrebbe causare conflitti, come di seguito:
UPDATE DataNumenProduct SET ProductId = 6 WHERE ProductId = 1;
Di seguito i record aggiornati in tabella:
Figura 4 Record aggiornati nella tabella “DataNumen Prodotti"
- Quindi possiamo ripristinare il record eliminato nella tabella, come di seguito:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair ');
Ora vediamo la versione finale, come di seguito:
Figura 5 Record Finali in Tabella “DataNumen Prodotti"
Soluzione alternativa 3: Disabilitare temporaneamente il vincolo di unicità tramite SQL
- Per risolvere il problema, possiamo eliminare temporaneamente il vincolo di chiave primaria "pk" dalla tabella, come mostrato di seguito:
ALTER TABLE DataNumenProduct DROP CONSTRAINT pk;
- Quindi possiamo aggiungere nuovamente il record eliminato alla tabella, come di seguito:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Ora vediamo i record nella tabella:
Figura 6 Record aggiornati nella tabella “DataNumen Prodotti"
- Quindi, poiché due record hanno gli stessi valori di chiave primaria, è necessario modificarne uno per evitare conflitti, come di seguito:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Alla fine, aggiungiamo di nuovo il vincolo di chiave primaria "pk" alla tabella, come di seguito:
ALTER TABLE DataNumenProduct ADD CONSTRAINT pk PRIMARY KEY(ProductId);
Ora ci sono alcuni record nella tabella, come di seguito:
Figura 7 Contenuto aggiornato nella tabella "DataNumen Prodotti"
Soluzione alternativa 4: Disabilitare temporaneamente il vincolo di unicità tramite SQL Server Studio di direzione:
- In primo luogo, eliminiamo il vincolo di chiave primaria "pk" nella tabella tramite GUI, come di seguito:
Figura 8 Eliminare il vincolo di chiave primaria "pk" tramite GUI
- Quindi inseriamo il record cancellato nel caso reale nella tabella, come di seguito.
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Ora ci sono alcuni record nella tabella, come di seguito:
Figura 9 Contenuto aggiornato nella tabella "DataNumen Prodotti"
- Quindi modifichiamo il valore della chiave primaria del record esistente nella tabella, come di seguito:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Infine, aggiungiamo nuovamente il vincolo di chiave primaria "pk" alla tabella tramite la GUI, come di seguito:
Figura 8 Aggiungere nuovamente il vincolo di chiave primaria "pk" tramite GUI
Risolvere SQL Server Danneggiamento del database
Oltre ai vincoli Unique, SQL Server corruzione è anche un problema molto comune che infastidisce i DBA. Normalmente possiamo usare SQL Server comandi integrati per risolvere le corruzioni. Tuttavia, se non funzionano, possiamo ricorrere a terze parti SQL Server strumenti di recupero dati.
Introduzione dell'autore:
Jim Hu è un esperto di recupero dati in DataNumen, Inc., che è il leader mondiale nelle tecnologie di recupero dati, tra cui Riparazione di accesso and dbf riparare prodotti software. Per maggiori informazioni visita www.datanumen.com








