Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Membuat Kunci Asing di SQL Server (Contoh T-SQL)

Pada artikel ini saya menunjukkan cara membuat kunci asing di SQL Server menggunakan Transact-SQL. Saya mendemonstrasikan cara membuat kunci asing pada saat membuat tabel (bukan memperbarui tabel yang sudah ada).

Kunci asing adalah kolom yang mereferensikan kolom kunci utama tabel lain. Ini menciptakan hubungan antar tabel.

Contoh 1 – Persiapan

Dalam contoh ini saya akan membuat database pengujian dengan satu tabel. Tabel ini akan berisi kunci utama yang akan dirujuk oleh kunci asing kita.

Buat databasenya:

BUAT DATABASE FK_Test;

Sekarang buat tabel kunci utama:

GUNAKAN FK_Test;CREATE TABLE Country( CountryId int IDENTITY (1,1) NOT NULL PRIMARY KEY, CountryName nvarchar(60));

Contoh 2 – Membuat Kunci Asing

Sekarang setelah kita memiliki tabel dengan kunci utama, mari buat tabel lain dengan kunci asing yang mereferensikan kunci utama tersebut.

BUAT TABEL Kota( CityId int IDENTITY (1,1) NOT NULL PRIMARY KEY, CountryId int NOT NULL REFERENSI Negara(CountryId), CityName nvarchar(60));

Ini adalah cara paling sederhana untuk membuat kunci asing. Yang kita lakukan hanyalah menambahkan REFERENCES klausa (bersama dengan tabel dan kolom kunci utama) ke kolom yang akan memiliki batasan kunci asing.

Untuk lebih jelasnya, bagian yang mendefinisikan kunci asing adalah ini:

REFERENSI Negara(CountryId)

Ini termasuk dalam definisi kolom dan hanya menyatakan bahwa kolom ini akan mereferensikan CountryId kolom di Country tabel.

Dalam hal ini, kunci asing dan kunci utama yang dirujuk, memiliki nama yang sama (CountryId ). Namun, ini bukan persyaratan – kolom kunci asing Anda dapat memiliki nama yang sama sekali berbeda dengan kolom yang dirujuknya (walaupun semua kolom yang berpartisipasi dalam hubungan kunci asing harus didefinisikan dengan panjang dan skala yang sama).

Contoh ini menyebabkan SQL Server secara otomatis menghasilkan nama kunci asing. Itu karena saya tidak memberikan nama. Baca terus untuk mengetahui cara membuat nama untuk kunci asing Anda.

Tapi pertama-tama, mari kita periksa batasan kunci asing yang baru saja kita buat.

Contoh 3 – Periksa Batasan Kunci Asing

Ada banyak cara untuk mengembalikan kunci asing menggunakan T-SQL, dan ini salah satunya:

EXEC sp_fkeys @fktable_name =Kota;

Hasil (menggunakan keluaran vertikal):

PKTABLE_QUALIFIER | FK_TestPKTABLE_OWNER | dboPKTABLE_NAME | NegaraPKCOLUMN_NAME | CountryIdFKTABLE_QUALIFIER | FK_TestFKTABLE_OWNER | dboFKTABLE_NAME | KotaFKCOLUMN_NAME | CountryIdKEY_SEQ | 1UPDATE_ATURAN | 1HAPUS_ATURAN | 1FK_NAME | FK__City__CountryId__38996AB5PK_NAME | PK__Negara__10D1609FC8BFA7F2DEFERRABILITY | 7

sp_fkeys prosedur tersimpan sistem mengembalikan informasi tentang kunci asing kami, kunci utama terkait, dan detail relevan lainnya. Anda cukup memasukkan nama tabel kunci asing atau tabel kunci utama, dan itu akan mengembalikan info yang relevan.

Dalam contoh ini, saya memberikan nama tabel kunci asing – City . Pada hasilnya, kita dapat melihat FK_NAME kolom untuk melihat bahwa tabel ini memiliki batasan kunci asing yang disebut FK__City__CountryId__38996AB5 . Ini yang baru saja kita buat.

Jadi sekarang setelah kita membuat kunci asing, setiap kali kita mencoba memasukkan atau memperbarui nilai di City.CountryId kolom, batasan kunci asing hanya akan mengizinkannya jika nilai yang sama sudah ada di Country.CountryId kolom. Ini memastikan bahwa integritas referensial dipertahankan dalam database.

Contoh 4 – Opsi Lainnya

Dimungkinkan untuk menambahkan lebih banyak opsi ke definisi kunci asing Anda.

Misalnya Anda dapat memberikan nama untuk kunci asing. Anda juga dapat menentukan apa yang harus terjadi pada nilai di kolom ini jika nilai yang sesuai di kunci utama diperbarui atau dihapus.

Di sini, saya membuat kedua tabel lagi, tetapi kali ini saya secara eksplisit menentukan opsi ini (saya melakukan hal yang sama untuk kunci utama):

CREATE TABLE Country( CountryId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_Country_CountryId PRIMARY KEY CLUSTERED (CountryId), CountryName nvarchar(60));CREATE TABLE City( CityId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_City_CityId PRIMARY KEY CLUSTERED (CityId), CountryId int NOT NULL, CONSTRAINT FK_City_Country FOREIGN KEY (CountryID) REFERENSI Negara (CountryID) ON DELETE CASCADE ON UPDATE CASCADE, CityName nvarchar(60)); 

Dalam hal ini, definisi kunci asing dimulai dengan CONSTRAINT , diikuti dengan nama kunci asing, diikuti dengan FOREIGN KEY , diikuti oleh kolom tempat batasan kunci asing akan diterapkan (disisipkan dalam tanda kurung).

Kami kemudian melihat REFERENCES yang sama klausa yang kita lihat pada contoh sebelumnya.

ON DELETE CASCADE dan ON UPDATE CASCADE klausa digunakan untuk memastikan bahwa perubahan yang dibuat pada Country tabel secara otomatis disebarkan ke City meja. Misalnya, jika sebuah baris dihapus dari tabel induk (kunci utama), setiap baris yang sesuai akan dihapus dari tabel referensi (kunci asing).

Nilai default untuk ON DELETE dan ON UPDATE adalah NO ACTION . Dalam hal ini Mesin Basis Data menimbulkan kesalahan, dan tindakan pembaruan atau penghapusan pada baris di tabel induk dibatalkan.

Anda juga dapat menggunakan SET NULL untuk mengatur kolom kunci asing ke NULL (memerlukan kolom kunci asing untuk menjadi nullable), atau SET DEFAULT untuk menyetelnya ke nilai default (memerlukan kolom kunci asing untuk memiliki definisi default. Jika kolom adalah nullable, dan tidak ada nilai default eksplisit yang ditetapkan, NULL menjadi nilai default implisit kolom).

Dalam contoh ini saya juga mengambil kesempatan untuk menyebutkan kunci utama. Anda dapat melihat bahwa sintaks kunci utama mirip dengan sintaks kunci asing, tetapi tanpa REFERENCES klausa (dan dengan tambahan CLUSTERED argumen, yang merupakan default untuk kunci utama).

Sekarang periksa kunci asing:

EXEC sp_fkeys @fktable_name =Kota;

Hasil:

PKTABLE_QUALIFIER | FK_TestPKTABLE_OWNER | dboPKTABLE_NAME | NegaraPKCOLUMN_NAME | CountryIdFKTABLE_QUALIFIER | FK_TestFKTABLE_OWNER | dboFKTABLE_NAME | KotaFKCOLUMN_NAME | CountryIdKEY_SEQ | 1UPDATE_ATURAN | 0HAPUS_ATURAN | 0FK_NAME | FK_City_CountryPK_NAME | PK_Country_CountryIdDEFERRABILITY | 7

Kita bisa melihat nama foreign key tersebut sekarang FK_City_Country dan batasan kunci utama dari kolom yang dirujuknya disebut PK_Country_CountryId .

Contoh 5 – Kunci Asing pada Beberapa Kolom

Anda juga dapat membuat kunci asing di beberapa kolom yang mereferensikan kunci utama multikolom. Kunci primer multikolom juga dikenal sebagai kunci primer komposit. Untuk membuat kunci asing komposit, cukup pisahkan kolom dengan koma saat mendefinisikan kunci.

Seperti ini:

BATASAN FK_FKName FOREIGN KEY (FKColumn1, FKColumn2)REFERENSI PrimaryKeyTable (PKColumn1, PKColumn2)

Lihat Cara Membuat Kunci Asing Gabungan di SQL Server untuk contoh yang lebih detail.

Apakah Kunci Utama Benar-Benar Diperlukan?

Kunci utama tidak mutlak diperlukan untuk kunci asing, karena Anda dapat menggunakan batasan unik atau indeks unik. Secara khusus, dokumentasi Microsoft menyatakan ini:

FOREIGN KEY batasan hanya dapat mereferensikan kolom di PRIMARY KEY atau UNIQUE batasan dalam tabel yang direferensikan atau dalam UNIQUE INDEX pada tabel yang dirujuk.

Jadi, meskipun biasanya merupakan praktik yang baik untuk memiliki kunci utama di semua tabel, kunci asing Anda tidak berkewajiban untuk mereferensikannya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kepatuhan GDPR dan SQL Server Anda

  2. Sql Server memicu memasukkan nilai dari baris baru ke tabel lain

  3. Bagaimana cara memasukkan catatan dan mengembalikan ID yang baru dibuat menggunakan SqlCommand tunggal?

  4. Otomatiskan Pekerjaan Pencadangan dan Pemeliharaan Menggunakan Rencana Pemeliharaan di SQL Server

  5. Saat menggunakan GETDATE() di banyak tempat, apakah lebih baik menggunakan variabel?