11 DI20002 Nguyễn Minh Ngọc 1992 Hà Nam K47A
LOP MALHC TENLHC
K47S1 Lóp 1 Khố 47 khoa s
K48I1 Lớp lKhố48khoai
K49N3 Lớp 3 Khoá 49 khoa N
K50A4 Lớp 4 Khoá 50 khoa A
K50B1 Lớp 1 Khố 50 khoa B
Ví dụ nếu chèn bộ giá trị <‘14D140003’, ‘Vũ Hồng Ánh, ‘1991’,
‘Bắc Ninh’, ‘K47S1 ’> vào quan hệ sV thì phép chèn này sẽ bị từ chối vì phép chèn đã vi phạm ràng buộc khố chính do MSV có giá trị là
14D140003 đã tồn tại ở trong quan hệ.
2.2.1.2. Ràng buộc tham chiếu
Mỗi quan hệ giữa các thực thể trong thiết kế mức khái niệm được
ánh xạ tương ứng thành một ràng buộc tham chiếu trong thiết kế logic. Ràng buộc tham chiếu (referential constraint) này còn được gọi là ràng buộc tồn vẹn tham chiếu (referential integrity constraint). Đó là ràng
buộc bắt buộc thực hiện một quan hệ giữa các bảng trong cơ sở dữ liệu
quan hệ. Bắt buộc thực hiện ở đây có nghĩa là hệ quàn trị cơ sở dữ liệu tự
động kiểm tra để đảm bảo mỗi giá trị khóa ngồi trong bảng con ln
ln có một khóa chính tương ứng ưong bảng cha. Đơi khi, ràng buộc
tham chiếu này cịn được gọi là ràng buộc khố ngoại.
Ràng buộc tồn vẹn tham chiếu phải xác định trên 2 quan hệ: quan
hệ tham chiếu (referencing relation) và quan hệ được tham chiếu (referenced relation). Cụ thể là một bộ giá trị trong một quan hệ sẽ tham
chiếu tới một bộ giá trị đã tồn tại trong một quan hệ khác.
Ví dụ, với hai quan hệ SV(MSV, HTEN, NSINH, QQUAN, MALHC) và LOP(MALHC, TENLHC) trong ví dụ 2.16 thì quan hệ LOP
quan hệ này sẽ phải tồn tại trước các bộ frong quan hệ sv. Còn quan hệ
sv được gọi là quan hệ tham chiếu. Cụ thể hơn, thuộc tính MALHC
trong quan hệ s V tham chiếu tới thuộc tính MALHC ưong quan hệ LOP,
và khi đó thuộc tính MALHC ưong quan hệ sv được gọi là khố ngoại
cịn trong quan hệ LOP thì lại là khố chính.
Chú ỷ:
Khi cập nhật bảng, hệ qn trị cơ sở dữ liệu sẽ thực thi các ràng
buộc tham chiếu mà ta đã định nghĩa ừong bảng. Điểm mạnh của ràng buộc tham chiếu là chúng được thực thi tự động, vì thế các ràng buộc
tham chiếu ln ln có hiệu lực trừ khi nó bị quản trị viên cơ sở dữ liệu
vơ hiệu hóa. Điều này thể hiện rõ nhất khi chèn một dòng mới ưong bảng con, phép chèn sẽ bị từ chối nếu giá trị khóa ngồi trong dịng đó khơng có giá trị khóa chính tương ứng frong bảng cha.
Xét quan hệ sv và quan hệ LOP với các thể hiện như trong ví dụ
2.16. Nếu chèn bộ giá trị <‘11D14OOO7’, ‘Vũ Hồng Ánh, ‘1991’, ‘Bắc Ninh’, ‘K47S2’> vào quan hệ sv. Phép chèn này vi phạm ràng buộc tham chiếu do ưong quan hệ LOP khơng có mã lớp hành chính nào có giá trị bằng K47S2 nên phép chèn này sẽ bị loại bỏ.
Như vậy, để chèn một bộ giá trị cho một sinh viên mới vào quan hệ
sv thì ngồi các thơng tin về sinh viên như mã sinh viên, họ tên sinh viên, năm sinh, và quê quán thì ta phải đưa vào các thơng tin về lớp hành chính mà sinh viên đó theo học. Các thơng tin về lớp hành chính phải
được đưa vào một cách đúng đắn và phù hợp với các thông tin của lớp đó trong các quan hệ khác.
Khi cập nhật một khóa ngồi ứong bảng con, phép cập nhật sẽ bị từ
chối nếu giá trị khóa ngồi đó khơng tồn tại trong tập giá trị khóa chính của bảng cha.
Xét quan hệ sv và quan hệ LOP với các thể hiện như trong ví dụ
2.16. Nếu cập nhật lại giá trị mã lớp hành chính của sinh viên có MSV =
chiếu do trong quan hệ LOP khơng có mã lớp hành chính nào có giá trị bằng K49S5 nên phép cập nhật này sẽ bị từ chối.
Khi xóa một dịng trong bảng cha, nếu dịng này có liên quan tới
các dòng của bảng con thi các dòng này trong bảng con cũng phải bị xóa, nếu khơng phép xóa trong bảng cha sẽ khơng được thực hiện.
Xét quan hệ sv và quan hệ LOP với các thể hiện như trong ví dụ 2.16. Nếu xố một bộ giá trị của quan hệ LOP có MALHC có giá trị
bàng K50B1 thì phép xố này được chấp nhận. Nhưng nếu xố bộ giá trị
của quan hệ LOP có MALHC có giá trị bằng K47S1 thì phép xố này
khơng được chấp nhận bởi vì có các bộ trong quan hệ sv tham chiếu đến
bộ này, như vậy là vi phạm ràng buộc tham chiếu.
2.2.2. Ràng buộc toàn vẹn
Ràng buộc toàn vẹn (integrity constraint) là ràng buộc làm tăng
thêm tính chính xác của dữ liệu trong cơ sở dữ liệu. Ưu điểm chính của ràng buộc tồn vẹn là hệ quản trị cơ sở dữ liệu tự động thực thi những
ràng buộc này, tức là ràng buộc ln ln được duy trì, cho dù ta kết nối
tới cơ sở dữ liệu bằng bất cứ cách nào, trừ khi nó bị quản trị viên cơ sờ
dữ liệu vơ hiệu hóa. Một số kiểu ràng buộc toàn vẹn chủ yếu là ràng buộc NOT NULL, ràng buộc CHECK và ràng buộc bắt buộc với các trigger.
2.2.2.1. Ràng buộc NOT NULL
Khi định nghĩa cột trong cơ sở dữ liệu, ta có thể xác định cột có
được cho phép nhận giá trị null hay không. Giá trị null (null value) trong cơ sở dữ liệu là một mã đặc biệt, được đặt vào một cột để biểu thị giá trị của cột đó trong hàng là khơng xác định. Giá trị null khác với giá trị trống, chuỗi rỗng, hay giá trị không. Giá trị null là một mã đặc biệt,
không biểu thị ý nghĩa nào khác ưong cơ sở dữ liệu.
Cách xử lý thống nhất đối với giá trị null được quy định trong tiêu
chuẩn ANSI/ISO SQL.
Các cột là thành phần cùa khóa chính phải được chi rõ là NOT
khóa chính tự động tạo ra định nghĩa chỉ mục duy nhất trên cột khóa
chính. Các cột khóa ngồi phải có mệnh đề NOT NULL, nếu quan hệ là
bắt buộc; ngược lại, khóa ngồi có thể nhận giá trị NULL.
Ví dụ 2.17: Xét quan hệ sv và quan hệ LOP với các thể hiện như
trong ví dụ 2.14. Nếu chèn bộ giá trị <Null, ‘Vũ Hồng Ánh, ‘1991’, ‘Bắc Ninh’, ‘K47S2’> vào quan hệ sv thì phép chèn này sẽ bị từ chối do vi phạm ràng buộc NOT NULL do nhập giá trị null cho khố chính MSV
trong quan hệ sv.
2.2.2.2. Ràng buộc CHECK
Ràng buộc CHECK sử dụng một câu lệnh logic đơn giàn để kiểm tra tính họp lệ của giá trị cột. Kết quả của câu lệnh logic đó phải là giá trị logic là true hoặc false, nếu kết quả là true thì giá trị cột được đặt vào bảng; ngược lại, nếu kết quả là false thì giá trị cột khơng được đặt vào
bảng, hệ quản trị cơ sở dữ liệu sẽ đưa ra thông báo lỗi tương ứng. Thông
thường, ràng buộc CHECK chỉ được dùng trong trường hợp cần so sánh giá trị cột với một giá trị đơn, một khoảng hoặc danh sách các giá trị, hay giá trị của những cột khác trên cùng một dòng dữ liệu.
Trong một số các hệ quản trị cơ sở dữ liệu mệnh đề CHECK cho phép các miền được hạn chế rất mạnh mà hầu hết các hệ thống kiểu ngôn ngữ lập trình khơng cho phép. Đặc biệt mệnh đề CHECK cho phép người
thiết kế sơ đồ đặc tả một thuộc tính phải thoả mãn một giá trị nào đó
được gán đối với một biến có kiểu là miền này. Dạng khai báo ràng buộc miền là:
CONSTRAINT <Tên ràng buộc> CHECK <điều kiện>
Ví dụ 2.18: Khai báo ràng buộc lương của nhân viên dưới
5.000.000 đối với quan hệ NHANVIEN(MaNV, Hoten, NS, Luong)
trong ví dụ 2.1:
Với câu lệnh này thì giá tri frên cột thuộc tính lương của tất cả các
nhân viên có mức lương dưới 5.000.000 sẽ được lưu trữ trong bảng
NHANVIEN và ngược lại, thì hệ quản trị CSDL sẽ thông báo lỗi.
Mệnh đề CHECK cũng có thể được sử dụng để hạn chế một miền
khơng chứa một gjá trị nào đó hay chỉ chứa một tập các giá trị được đặc tả. Dạng tổng quát là:
CONSTRAINT <Tên ràng buộc> CHECK (<Tên cột> {IN/NOT
IN} (tập giá trị))
Ví dụ 2.19: Khai báo ràng buộc về giới tính đối với thuộc tính GT
của nhân viên chỉ nhận một trong hai giá trị là Nam hoặc Nữ đối với
quan hệ NHANVIEN:
CONSTRAINT Gioitinh CHECK (GT IN (‘Nam’, ‘Nữ’))
2.2.23. Các ràng buộc thực thi sử dụng trigger
Một số ràng buộc phức tạp không thể sử dụng khai báo để thực thi
được. Khi đó, ta có thể sử dụng trigger, trigger là một mơ-đun logic lập trình, được kích hoạt khi xảy ra một sự kiện cụ thể ưong cơ sở dữ liệu. Khi trigger được kích hoạt, tùy thuộc vào kết quả xử lý mà nó chấp nhận
hay không chấp nhận thao tác của người sử dụng, nếu không chấp nhận thao tác của người sử dụng thì nó sẽ đưa ra thơng báo lỗi.
Trong Microsoft Access, các trigger được viét dưới dạng macro sử
dụng ngôn ngữ Microsoft Visual Basic for Applications. Một số hệ quản
trị cơ sở dữ liệu cung cấp một ngôn ngữ đặc biệt để viết các mơ-đun chương trình trigger như PL/SQL của Oracle, Transact SQL ữong
Microsoft SQL Server và Sybase ASE. Một số hệ quản trị cơ sở dữ liệu
có thể sử dụng ngơn ngữ c như DB2.
Ví dụ 2.20: Đoạn Trigger với MS SQL server sau đây sẽ có chức
năng tự động giảm số lượng hàng hiện cỏ khi một mặt hàng nào đó được bán (tức là khi câu lệnh INSERT được thực thi trên bảng
CREATE TRIGGER trg_nhatkybanhang_insert ON NHATKYBANHANG FOR INSERT
AS
UPDATE MATHANG
SET mathang.soluong=mathang.soluong-inserted.soluong FROM
MATHANG
INNER JOIN inserted ON mathang.mahang=inserted.mahang