Bagaimana cara mengubah batasan kunci utama menggunakan sintaks SQL?

100

Saya memiliki tabel yang tidak memiliki kolom dalam batasan kunci utamanya. Alih-alih mengeditnya melalui SQL Server, saya ingin memasukkan ini ke dalam skrip untuk menambahkannya sebagai bagian dari skrip pembaruan kami.

Sintaks apa yang dapat saya gunakan untuk melakukan ini? Haruskah saya melepaskan dan membuat ulang batasan utama?

Jason
sumber
5
AFAIK ya, Anda perlu menghentikan dan membuat ulang batasan PK. Saya tidak ingat perintah apa pun untuk menambahkan kolom ke batasan PK / FK yang sudah ada.
Seramme

Jawaban:

149

Iya. Satu-satunya cara adalah menghilangkan batasan dengan tabel Alter lalu membuatnya kembali.

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)
darnir
sumber
11
Jika Anda tidak mengetahui nama batasan kunci utama, gunakan kueri yang ditemukan di sini untuk mencarinya (atau cari dan lepas semuanya sekaligus). http://stackoverflow.com/a/13948609/945875
Justin
jika tidak jelas, atau orang lain membuat kesalahan yang sama, nama batasan tidak bisa masuk tanda kutip alter table PatientsInfo drop constraint PK__Patients__1CBB51380A338187berfungsi di sini
Maslow
1
Bagi Anda yang belum mengetahui batasan nama: ALTER TABLE db. table DROP KUNCI UTAMA, TAMBAHKAN KUNCI UTAMA ( id1, id2);
karsten314159
21

PRIMARY KEY CONSTRAINTtidak dapat diubah, Anda hanya dapat melepaskannya dan membuat lagi. Untuk kumpulan data besar, ini dapat menyebabkan waktu jangka panjang dan dengan demikian - tabel tidak tersedia.

Oleg Dok
sumber
3

Dari segi kinerja, tidak ada gunanya mempertahankan indeks yang tidak berkerumun selama ini karena mereka akan diperbarui ulang saat drop dan buat. Jika ini adalah kumpulan data besar, Anda harus mempertimbangkan untuk mengganti nama tabel (jika mungkin, pengaturan keamanan apa saja?), Membuat ulang tabel kosong dengan kunci yang benar, memigrasikan semua data di sana. Anda harus memastikan Anda memiliki cukup ruang untuk ini.

Oky
sumber
3

Dalam kasus saya, saya ingin menambahkan kolom ke kunci Primer (kolom4). Saya menggunakan skrip ini untuk menambahkan kolom4

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
sumber
-4

Anda dapat mengganti nama objek kendala menggunakan sp_rename (seperti yang dijelaskan dalam jawaban ini )

sebagai contoh:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint'
Garrett Taiji
sumber
3
Pertanyaannya adalah bagaimana mengubah batasan, yaitu TAMBAHKAN kolom, bukan bagaimana mengganti nama.
Andrew Steitz