Jika Anda menggunakan nama seseorang sebagai kunci utama dan namanya berubah, Anda perlu mengubah kunci utama. Ini adalah apa ON UPDATE CASCADE
yang digunakan untuk karena pada dasarnya Cascades perubahan ke semua tabel terkait yang memiliki hubungan asing kunci untuk kunci primer.
Sebagai contoh:
USE tempdb;
GO
CREATE TABLE dbo.People
(
PersonKey VARCHAR(200) NOT NULL
CONSTRAINT PK_People
PRIMARY KEY CLUSTERED
, BirthDate DATE NULL
) ON [PRIMARY];
CREATE TABLE dbo.PeopleAKA
(
PersonAKAKey VARCHAR(200) NOT NULL
CONSTRAINT PK_PeopleAKA
PRIMARY KEY CLUSTERED
, PersonKey VARCHAR(200) NOT NULL
CONSTRAINT FK_PeopleAKA_People
FOREIGN KEY REFERENCES dbo.People(PersonKey)
ON UPDATE CASCADE
) ON [PRIMARY];
INSERT INTO dbo.People(PersonKey, BirthDate)
VALUES ('Joe Black', '1776-01-01');
INSERT INTO dbo.PeopleAKA(PersonAKAKey, PersonKey)
VALUES ('Death', 'Joe Black');
A SELECT
terhadap kedua tabel:
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonKey = pa.PersonKey;
Pengembalian:
Jika kami memperbarui PersonKey
kolom, dan jalankan kembali SELECT
:
UPDATE dbo.People
SET PersonKey = 'Mr Joe Black'
WHERE PersonKey = 'Joe Black';
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonKey = pa.PersonKey;
kami melihat:
Melihat rencana UPDATE
pernyataan di atas , kami melihat dengan jelas bahwa kedua tabel diperbarui oleh pernyataan pembaruan tunggal berdasarkan kunci asing yang didefinisikan sebagai ON UPDATE CASCADE
:
klik gambar di atas untuk melihatnya lebih jelas
Akhirnya, kami akan membersihkan tabel sementara kami:
DROP TABLE dbo.PeopleAKA;
DROP TABLE dbo.People;
1 cara yang disukai untuk melakukan ini menggunakan kunci pengganti adalah:
USE tempdb;
GO
CREATE TABLE dbo.People
(
PersonID INT NOT NULL IDENTITY(1,1)
CONSTRAINT PK_People
PRIMARY KEY CLUSTERED
, PersonName VARCHAR(200) NOT NULL
, BirthDate DATE NULL
) ON [PRIMARY];
CREATE TABLE dbo.PeopleAKA
(
PersonAKAID INT NOT NULL IDENTITY(1,1)
CONSTRAINT PK_PeopleAKA
PRIMARY KEY CLUSTERED
, PersonAKAName VARCHAR(200) NOT NULL
, PersonID INT NOT NULL
CONSTRAINT FK_PeopleAKA_People
FOREIGN KEY REFERENCES dbo.People(PersonID)
ON UPDATE CASCADE
) ON [PRIMARY];
INSERT INTO dbo.People(PersonName, BirthDate)
VALUES ('Joe Black', '1776-01-01');
INSERT INTO dbo.PeopleAKA(PersonID, PersonAKAName)
VALUES (1, 'Death');
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonID = pa.PersonID;
UPDATE dbo.People
SET PersonName = 'Mr Joe Black'
WHERE PersonID = 1;
Untuk kelengkapan, rencana pernyataan pembaruan sangat sederhana, dan menunjukkan satu keuntungan untuk mengganti kunci, yaitu hanya satu baris yang perlu diperbarui dibandingkan dengan setiap baris yang berisi kunci dalam skenario kunci-alami:
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonID = pa.PersonID;
DROP TABLE dbo.PeopleAKA;
DROP TABLE dbo.People;
Output dari dua SELECT
pernyataan di atas adalah:
Pada dasarnya, hasilnya hampir sama. Satu perbedaan utama adalah kunci alami lebar tidak diulang di setiap tabel di mana kunci asing terjadi. Dalam contoh saya, saya menggunakan VARCHAR(200)
kolom untuk menyimpan nama orang tersebut, yang mengharuskan penggunaan di VARCHAR(200)
mana - mana . Jika ada banyak baris dan banyak tabel yang berisi kunci asing, itu akan menambah banyak memori yang terbuang. Catatan, saya tidak berbicara tentang ruang disk yang terbuang karena kebanyakan orang mengatakan ruang disk sangat murah sehingga pada dasarnya gratis. Memori, bagaimanapun, mahal dan pantas untuk dihargai. Menggunakan integer 4-byte untuk kunci akan menghemat sejumlah besar memori ketika Anda mempertimbangkan panjang nama rata-rata sekitar 15 karakter.
Bersinggungan dengan pertanyaan tentang bagaimana dan mengapa kunci dapat berubah adalah pertanyaan tentang mengapa memilih kunci alami daripada kunci pengganti, yang merupakan pertanyaan yang menarik dan mungkin lebih penting, terutama di mana kinerja adalah tujuan desain. Lihat pertanyaan saya di sini tentang itu.
1 - http://weblogs.sqlteam.com/mladenp/archive/2009/10/06/Why-I-prefer-surrogate-keys-instead-of-natural-keys-in.aspx