Ràng buc UNIQUE trong SQL Server
Trên mt bng ch có th có nhiu nht mt khóa chính nhưng có th có nhiu ct hoc tp
các ct có tính cht như khoá chính, tc là giá tr ca chúng là duy nht trong bng. Tp mt
hoc nhiu ct có giá tr duy nht và không được chn làm khoá chính được gi là khoá ph
(khoá d tuyn) ca bng. Như vy, mt bng ch có nhiu nht mt khoá chính nhưng có th
có nhiu khoá ph.
Ràng buc UNIQUE được s dng trong câu lnh CREATE TABLE để định nghĩa khoá ph
cho bng và được khai báo theo cú pháp sau đây:
[CONSTRAINT tên_ràng_buc]
UNIQUE [(danh_sách_ct)]
Ví d : Gi s ta cn định nghĩa bng LOP vi khoá chính là ct MALOP nhưng đồng thi li
không cho phép các lp khác nhau được trùng tên lp vi nhau, ta s dng câu lnh như sau:
CREATE TABLE lop
(
malop NVARCHAR(10) NOT NULL,
tenlop NVARCHAR(30) NOT NULL,
khoa SMALLINT NULL,
hedaotao NVARCHAR(25) NULL,
namnhaphoc INT NULL,
makhoa NVARCHAR(5),
CONSTRAINT pk_lop PRIMARY KEY (malop),
CONSTRAINT unique_lop_tenlop UNIQUE(tenlop)
)
SQL Server cung cp các loi ràng buc sau:
PRIMARY KEY:
khóa chính ca bng, là định danh duy nht cho mi bn ghi trong bng. Nó đòi hi ct (hoc
các ct) to thành khóa chính phi tha mãn hai điu kin: không NULL và mi giá tr phi
duy nht trong toàn bng. Mi bng ch cho phép ti đa mt khóa chính và theo nguyên tc
thiết kế, mi bng đều cn có khóa chính. Có ba cách khai báo khóa chính:
--Cách 1
CREATE TABLE dbo.Bang(Cot_1 INT NOT NULL PRIMARY KEY,Cot_2 VARCHAR(100),...)
--Cách 2
CREATE TABLE dbo.Bang(Cot_1 INT NOT NULL,Cot_2 VARCHAR(100),...CONSTRAINT P
K_Bang PRIMARY KEY (Cot_1, Cot_2))
--Cách 3, thêm ràng buc cho bng đã có sn
ALTER TABLE dbo.Bang ADD CONSTRAINT PK_Bang PRIMARY KEY (Cot_1, Cot_2)
Khi có khai báo khóa chính, SQL Server t động to mt unique index để thc thi tính duy
nht. Đây là cách làm ti ưu để kim tra xem mt giá tr có duy nht hay không. Mi khi có giá
tr mi được thêm vào hay được cp nht, h thng s định v trên cây index để tìm v trí thích
hp cho nó. Nếu giá tr này đã xut hin, h thng s văng ngược tr ra và báo li. Ngược li,
giá tr mi được lưu vào cây index.
Index được to cùng vi khóa chính mt cách mc định là clustered index. Bn có th ch
định nó là non-clustered khi cn thiết, nhưng thông thường bn nên để chế độ mc định.
Bn nên chn trường có kích thước nh làm khóa chính. Khi có nhiu trường kết hp vi nhau
xác định định danh ca bn ghi (ví d ba trường tên, ngày sinh và nguyên quán ca bng thí
sinh), bn có th to thêm mt trưng THISINH_ID kiu INTEGER làm đại din và dùng nó
làm khóa chính, và đưa ba trường kia vào mt khóa duy nht (xem phn dưới đây).
UNIQUE KEY CONSTRAINT:
ràng buc duy nht, yêu cu các giá tr trong ct phi khác nhau. Ràng buc này cho phép
ct hoc các ct cu thành khóa phi là NULL, tuy nhiên ch mt giá tr NULL được phép xut
hin (v khác bit gia định nghĩa khóa duy nht ca ANSI và SQL Server, mi bn đọc thêm
bài To Ràng Buc Duy Nht Bng Filtered Index). Bn có th to nhiu ràng buc duy nht
trên cùng mt bng. Ràng buc duy nht cũng kéo theo mt unique index ging như vi khóa
chính, và cơ chế kim tra tính duy nht cũng ging như vy. Đim khác là unique index được
to đây mc định là non-clustered, tr khi bn ch định nó là clustered.
Bn có th thy v mt logic, ràng buc duy nht cng thêm NOT NULL tương đương vi
khóa chính. Và ngoi tr mt vài khác bit nh, to mt unique index trên ct cũng tương
đương vi to ràng buc duy nht trên ct đó.
To ràng buc duy nht:
ALTER TABLE ThiSinh ADD CONSTRAINT UC_ThiSinh UNIQUE (Ten, NgaySinh,
NguyenQuan)
FOREIGN KEY:
ràng buc khóa ngoi. Nó đòi hi ct ch được phép cha giá tr xut hin trong ct khóa
chính ca bng khác. Ràng buc này đảm bo tính toàn vn tham chiếu d liu. Ví d vi
database bán hàng, bn có bng SanPham vi SanPham_ID là khóa chính, và bng
BanHang có trường SanPham_ID vi mc đích cha ID ca các sn phm có trong bng
SanPham. Khi đó, bn cn to ràng buc khóa ngoi trên trường Sanpham_ID ca bng
BanHang, tham chiếu đến trường Sanpham_ID ca bng SanPham. Ràng buc này đảm
bo:
- Không ai có th đưa các giá tr SanPham_ID “tm by” vào bng BanHang. Các giá tr đều
phi tn ti trong bng SanPham. Ví d, bng SanPham cha các ID t 1 – 100; bn không
th thêm mt bn ghi vào bng BanHang vi SanPham_ID = 101. Nói cách khác, các hóa
đơn bán hàng phi cha các sn phm đã có trong danh mc.
- Nếu mt SanPham_ID đã xut hin trong bng BanHang (sn phm đã có giao dch), không
ai có th xóa bn ghi ca SanPham_ID đó trong bng SanPham. Ví d, trong bng SanPham
có cha sn phm Kindle Fire vi ID = 52; sau khi có giao dch bán hàng trên sn phm này,
bng BanHang s xut hin bn ghi vi SanPham_ID = 52; khi đó bn không th xóa bn ghi
ca Kindle Fire khi bng SanPham, vì bn ghi kia trong bng BanHang s tr nên m côi
(tham chiếu đến mt sn phm ID không tn ti).
ALTER TABLE dbo.BanHang
ADD CONSTRAINT FK_SanPham_ID FOREIGN KEY (SanPham_ID) REFERENCES dbo.Sa
nPham(SanPham_ID)
Mt vài lưu ý vi ràng buc khóa ngoi:
- Tuy ct là khóa ca bng, nhưng các giá tr cho phép ca nó li được qui định t mt ct
bng khác. Vì thế có tên gi khóa ngoi.
- Ct được tham chiếu phi là unique (primary key hoc unique key).
- Bng được tham chiếu phi nm trong cùng database.
NOT NULL: ràng buc này đơn gin là yêu cu d liu nhp vào cho ct phi cha giá tr ch
không được để NULL. Khi bn sa li mt ct thành NOT NULL ca bng đã cha d liu
(dùng ALTER TABLE), Toàn b các bn ghi ca bng đó s được kim tra. Nếu h thng tìm
thy NULL nó s báo li và hy b lnh ALTER TABLE. Lnh sau sa li ct SanPham_ID
thành NOT NULL:
ALTER TABLE dbo.BanHang ALTER TABLE SanPham_ID INT NOT NULL
DEFAULT:
ràng buc mc định. Khi nhp d liu cho bng mà ct đó không đưc cung cp giá tr thì giá
tr mc định s được s dng. Ví d bn có th to ràng buc DEFAULT cho trường NgayGD
(ngày giao dch) ca bng bán hàng là ngày gi h thng:
ALTER TABLE dbo.BanHang
ADD CONSTRAINT DF_NgayGD DEFAULT GETDATE() FOR NgayGD
CHECK:
ràng buc kim tra. Yêu cu ct tương ng phi tha mãn mt biu thc logic. Ví d, ràng
buc sau đòi hi ct SL (s lượng) phi ln hơn 0:
ALTER TABLE dbo.BanHang
ADD CONSTRAINT Chk_SL CHECK (SL>0)
Bn có th dùng hàm trong biu thc ca ràng buc check, min là hàm phi thuc loi tr v
giá tr đơn (scalar function, không được dùng hàm kiu bng).