Ho una chiave primaria a due colonne su un tavolo. Ho cercato di modificarlo per impostare il ignore_dup_key
su on con questo comando:Posso impostare ignore_dup_key su per una chiave primaria?
ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);
ma ottengo questo errore:
Cannot use index option ignore_dup_key to alter index 'PK_mypk' as it enforces a primary or unique constraint.
Altrimenti come devo impostare IGNORE_DUP_KEY
su on?
Il mio problema è questo: ho bisogno di inserire un gran numero di record ogni giorno e sto facendo un comando di inserimento per ogni record. Se il record esiste già, viene ignorato (generando un errore chiave duplicato). Da un POV delle prestazioni è meglio tentare un inserto e consentire ad alcuni di fallire piuttosto che controllare se il record esiste prima di inserirlo. Il passaggio successivo per migliorare le prestazioni consiste nell'utilizzare SqlBulkCopy per eseguire gli inserimenti anziché un singolo comando per ogni record. Ma questo non è possibile se esiste un record in quanto l'intero batch fallisce se ignore_dup_key è disattivato. –
Cosa succede se una delle colonne sulla mia chiave primaria è definita dall'utente? E se avessi bisogno di supportare inserimenti di più entità contemporaneamente, diciamo 1000? Come potrei verificare che tutte le voci siano univoche prima dell'inserimento senza un grave impatto sul server?Penso che l'opzione ignora duplicata sia abbastanza appropriata in quella situazione. Sei in disaccordo? – julealgon
Sì, non hai la chiave principale se ignori i duplicati e se non usi una chiave primaria, allora alla fine avrai un mondo di male con i dati cattivi. È una pratica migliore inserire i dati in una tabella di staging e quindi utilizzare un'istruzione select per inserire solo i nuovi record. Inseriamo milioni di record in questo modo. – HLGEM