Come posso modificare un vincolo di chiave primaria utilizzando la sintassi SQL?


100

Ho una tabella in cui manca una colonna nel suo vincolo di chiave primaria. Invece di modificarlo tramite SQL Server, voglio inserirlo in uno script per aggiungerlo come parte dei nostri script di aggiornamento.

Quale sintassi posso usare per farlo? Devo eliminare e ricreare il vincolo chiave?


5
Per quanto ne so, è necessario eliminare e ricreare il vincolo PK. Non ricordo alcun comando per aggiungere una colonna a un vincolo PK / FK già esistente.
Seramme

Risposte:


149

Sì. L'unico modo sarebbe eliminare il vincolo con una tabella Alter e quindi ricrearlo.

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)

11
Se non conosci il nome del vincolo della chiave primaria, usa la query trovata qui per cercarlo (o cerca e rilascia tutto in una volta). http://stackoverflow.com/a/13948609/945875
Justin

se non fosse chiaro, o qualcun altro commette lo stesso errore, il nome del vincolo non può essere racchiuso tra virgolette alter table PatientsInfo drop constraint PK__Patients__1CBB51380A338187sta funzionando qui
Maslow

1
Per quelli di voi che non conoscono il nome del vincolo: ALTER TABLE db. table RILASCIA CHIAVE PRIMARIA, AGGIUNGI CHIAVE PRIMARIA ( id1, id2);
karsten314159

21

PRIMARY KEY CONSTRAINTnon può essere modificato, puoi solo rilasciarlo e creare di nuovo. Per grandi set di dati può causare un lungo periodo di tempo e quindi - indisponibilità della tabella.


3

Dal punto di vista delle prestazioni, non ha senso mantenere gli indici non cluster durante questa operazione poiché verranno aggiornati nuovamente al momento della creazione e del rilascio. Se si tratta di un set di dati di grandi dimensioni, dovresti considerare di rinominare la tabella (se possibile, eventuali impostazioni di sicurezza su di essa?), Ricreando una tabella vuota con le chiavi corrette, migrare tutti i dati lì. Devi assicurarti di avere abbastanza spazio per questo.


3

Nel mio caso, voglio aggiungere una colonna a una chiave primaria (colonna4). Ho usato questo script per aggiungere 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
)

-4

puoi rinominare gli oggetti di vincolo usando sp_rename (come descritto in questa risposta )

per esempio:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'

3
La domanda era come modificare il vincolo, cioè AGGIUNGERE una colonna, non come rinominare.
Andrew Steitz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.