Mam dwukolumnowy klucz podstawowy na stole. Starałem się zmienić to ustawienie ignore_dup_key
do na z tym poleceniem:Czy mogę ustawić ignore_dup_key na klucz podstawowy?
ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);
Ale otrzymuję ten błąd:
Cannot use index option ignore_dup_key to alter index 'PK_mypk' as it enforces a primary or unique constraint.
Jak inaczej mam ustawiony IGNORE_DUP_KEY
się na?
Mój problem jest taki: muszę wstawić dużą liczbę rekordów codziennie i jestem obecnie robi polecenie insert dla każdego rekordu. Jeśli rekord już istnieje, zostanie zignorowany (poprzez zgłoszenie duplikatu błędu klucza). Z POV wydajności lepiej jest spróbować wstawić i pozwolić niektórym zawodzić, niż sprawdzić, czy rekord istnieje przed wstawieniem. Następnym krokiem do poprawy wydajności jest użycie SqlBulkCopy do wykonania wstawek zamiast pojedynczego polecenia dla każdego rekordu. Ale nie jest to możliwe, jeśli istnieje jakikolwiek rekord, ponieważ cała partia zakończy się niepowodzeniem, jeśli ignore_dup_key jest wyłączony. –
Co zrobić, jeśli jedna z kolumn mojego klucza podstawowego jest zdefiniowana przez użytkownika? A co, jeśli muszę obsługiwać wstawienia wielu jednostek jednocześnie, powiedzmy 1000? Jak mogę sprawdzić, czy wszystkie wpisy są unikatowe przed wstawieniem bez dużego obciążenia serwera?Myślę, że opcja ignorowania duplikatu jest w tej sytuacji odpowiednia. Czy się nie zgadzasz? – julealgon
Tak, nie kluczujesz, jeśli zignorujesz duplikaty, a jeśli nie, klucz podstawowy, to ostatecznie będziesz miał świat pełen urazów ze złymi danymi. Lepszą praktyką jest umieszczanie danych w tabeli pomostowej, a następnie użycie instrukcji select do wstawiania tylko nowych rekordów. W ten sposób wstawiamy milion rekordów. – HLGEM