Jak mogę zmienić ograniczenie klucza podstawowego za pomocą składni SQL?

100

Mam tabelę, w której brakuje kolumny w ograniczeniu klucza podstawowego. Zamiast edytować go za pośrednictwem SQL Server, chcę umieścić to w skrypcie, aby dodać go jako część naszych skryptów aktualizacji.

Jakiej składni mogę użyć, aby to zrobić? Czy muszę usunąć i odtworzyć kluczowe ograniczenie?

Jason
źródło
5
AFAIK tak, musisz porzucić i odtworzyć ograniczenie PK. Nie przypominam sobie żadnego polecenia dodania kolumny do już istniejącego ograniczenia PK / FK.
Seramme

Odpowiedzi:

149

Tak. Jedynym sposobem byłoby usunięcie ograniczenia za pomocą tabeli Alter, a następnie ponowne utworzenie go.

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)
darnir
źródło
11
Jeśli nie znasz nazwy ograniczenia klucza podstawowego, użyj zapytania znalezionego tutaj, aby ją wyszukać (lub wyszukaj i upuść wszystkie na raz). http://stackoverflow.com/a/13948609/945875
Justin
jeśli nie było jasne, lub ktoś inny popełnia ten sam błąd, nazwa ograniczenia nie może być umieszczona w cudzysłowie, alter table PatientsInfo drop constraint PK__Patients__1CBB51380A338187tutaj działa
Maslow
1
Dla tych z Was, którzy nie znają nazwy ograniczenia: ALTER TABLE db. table DROP PRIMARY KEY, ADD PRIMARY KEY ( id1, id2);
karsten314159
21

PRIMARY KEY CONSTRAINTnie można go zmienić, możesz go tylko upuścić i utworzyć ponownie. W przypadku dużych zbiorów danych może to spowodować długi czas działania, a tym samym - niedostępność tabeli.

Oleg Dok
źródło
3

Jeśli chodzi o wydajność, nie ma sensu przechowywać w tym czasie indeksów nieklastrowych, ponieważ zostaną one ponownie zaktualizowane po upuszczeniu i utworzeniu. Jeśli jest to zbiór dużych zbiorów danych, należy rozważyć zmianę nazwy tabeli (jeśli to możliwe, jakieś ustawienia zabezpieczeń?), Ponowne utworzenie pustej tabeli z poprawnymi kluczami spowoduje migrację wszystkich danych do tej tabeli. Musisz upewnić się, że masz na to wystarczająco dużo miejsca.

OK
źródło
3

W moim przypadku chcę dodać kolumnę do klucza podstawowego (kolumna4). Użyłem tego skryptu do dodania column4

ALTER TABLE TableA
DROP CONSTRAINT [PK_TableA]

ALTER TABLE TableA
ADD CONSTRAINT [PK_TableA] PRIMARY KEY (
    [column1] ASC,
    [column2] ASC, 
    [column3] ASC,
    [column4] ASC
)
MNF
źródło
-4

możesz zmienić nazwy obiektów z ograniczeniami za pomocą sp_rename (zgodnie z opisem w tej odpowiedzi )

na przykład:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'
Garrett Taiji
źródło
3
Pytanie brzmiało, jak zmienić ograniczenie, czyli dodać kolumnę, a nie jak zmienić nazwę.
Andrew Steitz