Các ràng buộc toàn vẹn (TBTV) và cách tạo ràng buộc trên bảng

Một phần của tài liệu Đề cương bài giảng học phần: Cơ sở dữ liệu (2014 - 2015) (Trang 80 - 86)

9. NGÔN NGỮ TRUY VẤN CẤU TRÚC SQL

9.5.3.Các ràng buộc toàn vẹn (TBTV) và cách tạo ràng buộc trên bảng

- NOT NULL - NULL - UNIQUE - DEFAULT - PRIMARYKEY - FOREIGNKEY/REFERENCES - CHECK

 Ràng buộc CHECK

Ràng buộc CHECK đƣợc sử dụng để chỉ định các giá trị hay khuôn dạng dữ liệu có thể đƣợc chấp nhận đối với một cột.Trên một cột có thể có nhiều ràng buộc CHECK. Để khai báo ràng buộc CHECK đối với một cột nào đó,ta sử dụng cú pháp nhƣ sau:

[CONSTRAINT constraint_name] CHECK (expression)

Trong đó expression là một biểu thức logic quy định giá trị hay khuôn dạng của dữ liệu đƣợc cho phép. Khi đó, chỉ những giá trị dữ liệu nào làm cho

expression nhận giá trị đúng mới đƣợc chấp nhận.

Ví dụ: Khi tạo bảng NHANVIEN, để quy định số điện thoại của nhân viên có dạng‟######‟ (chẳng hạn 713143) chúng ta sẽ viết câu lệnh nhƣ sau:

CREATE TABLE NHANVIEN( MANV CHAR(9), HONV VARCHAR(10), TENLOT VARCHAR(20), TENNV VARCHAR(10), NGSINH DATETIME, DCHI VARCHAR(50), PHAI CHAR(3), LUONG INT, MA_NQL CHAR(9), PHG INT,

DIENTHOAI CHAR(6) NULL constraint check_dienthoai CHECK (DIENTHOAI like '[0-9][0-9][0-9][0-9][0-9] [0-9]'))

Đặt tên ràng buộc

CREATE TABLE NHANVIEN (

HONV VARCHAR(10) CONSTRAINT NV_HONV_NN NOT NULL, TENLOT VARCHAR(20) NOT NULL,

TENNV VARCHAR(10) NOT NULL,

MANV CHAR(9) CONSTRAINT NV_MANV_PK PRIMARY KEY, NGAYSINH DATETIME, DCHI VARCHAR(50), GT CHAR(3) CONSTRAINT NV_GT_CHK CHECK (GT IN(„Nam‟,‟Nu‟)),

LUONG INT CONSTRAINT NV_LUONG_DF DEFAULT(10000), MA_NQL CHAR(9), PHG INT )

Ràng buộc DEFAULT

Ràng buộc DEFAULT dƣợc sử dụng để quy định cho một cột.Giá trị này sẽ tự động đƣợc gán cho cột này khi ngƣời sử dụng bổ sung một bản ghi mà

không chỉ định giá trị cho cột.Trên mỗi cột chỉ có thể có nhiều nhất một ráng buộc DEFAULT(tức là chỉ có thể có một giá trị mặc định).

Để khai báo một giá trị mặc định cho một cột, ta cho chỉ định một ràng buộc DEFAULT cho một cột bằng cách sử dụng cú pháp sau:

[CONSTRAINT constraint_name] DEFAULT{const_expression

|nonarguments_function |NULL}

Câu lệnh dƣới đây chỉ định giá trị mặc định là ‟khong biet‟ cho cột address trong bảng Person

CREATE TABLE Person (

LastName varchar, FirstName varchar,

Address varchar default „khong biet‟, Age int )

Ràng buộc PRIMARY KEY

Ràng buộc PRIMARY KEY đƣợc dử dụng để định nghĩa khóa chính của bảng. Một ràng buộc PRIMARY KEY đảm bảo không có giá trị trùng lặp đƣợc đƣa vào trong các cột. Hay nói cách khác, giá trị của khóa chính sẽ giúp cho ta xác định đƣợc duy nhất một dòng (bản ghi) trong bảng dữ liệu. Một bảng ghi chỉ có duy nhất một khóa chính và bản thân khóa chính không chấp nhận giá trị NULL. Ràng buộc PRIMARY KEY là cơ sở cho việc đảm bảo tính toàn vẹn thực thể cũng nhƣ toàn vẹn tham chiếu.

Để khai báo một ràng buộc PRIMARY KEY, bạn sử dụng cú pháp sau: [CONSTRAINT constraint_name]

PRIMARY KEY[ ( colname[ ,colname2[…, colname16] ] ) ]

Nếu khóa chính của một bảng chỉ là một cột, khi đó bạn cần thiết phải chỉ định danh sách các cột (sử dụng ràng buộc ở mức cột). Trong trƣờng hợp khóa chính là một tập hợp từ hai cột trở lên, bạn phải chỉ định danh các cột (sử dụng ràng buộc ở mức bảng).

Ràng buộc FOREIGN KEY (adsbygoogle = window.adsbygoogle || []).push({});

Các bảng bên trong một CSDL thƣờng có mối quan hệ với nhau.Các mối quan hệ này đƣợc xác định dựa trên tính bằng nhau giữa một hay nhiều trƣờng của bảng này với một hay nhiều trƣờng cảu bảng khác. Nếu một hay nhiều cột nào đócủa một bảng có giá trị đƣợc xác định từ một hay nhiều trƣờng khóa của bảng khác thì các cột đó đƣợc gọi là có ràng buộc khóa ngoại (foreign key). Các ràng buộc FOREIGN KEY đƣợc sử dụng với các ràng buộc PRIMARY KEY và UNIQUE nhằm đảm bảo tính toàn vẹn tham chiếu giữa các bảng đƣợc chỉ định.

Để khai báo khóa ngoại, ta sử dụng cú pháp nhƣ sau: [CONSTRAINT constraint_name]

REFERENCES reference_table [ (ref_colname [, ref_colname2

[...,ref_colname16] ] ) ]

Ví dụ: Tạo hai bảng NHANVIEN (MANV, HOTEN, NGAYSINH, DIACHI, DIENTHOAI, MADV) và

DONVI(MADV, TENDV) theo sơ đồ dƣới đây

1

Chúng ta sẽ viết câu lệnh tạo hai bảng trên nhƣ sau:

Lƣu ý khi tạo ràng buộc khóa ngoại

- Các cột tham gia vào liên kết giữa 2 bảng phải có cùng kiểu dữ liệu mặc dù tên cột có thể khác nhau.

- Bảng bị tham chiếu phải được tạo trước.

- Lưu ý 2 tùy chọn khi tạo ràng buộc khóa ngoại và ràng buộc tham chiếu:

Ví dụ: Tạo bảng thuctap, trƣớc khi tạo cấu trúc bảng này, bảng sv (có khóa chính là masv char(10)) và bảng dt (có khóa chính là madt char(10)) đã đƣợc tạo trƣớc. Bảng này có 1 khóa chính gồm 2 thuộc tính và 2 khóa ngoại tham chiếu đến 2 bảng sv, dt. CREATE TABLE thuctap (masv CHAR(10), madt CHAR(10) , NTT NVARCHAR(14), kqtt FLOAT CONSTRAINT c_kqtt CHECK(kqtt>0 AND kqtt<=10), CONSTRAINT p_tt PRIMARY key(masv,madt),

NHANVIEN #MADV HOTEN NGAYSINH DIACHI DIENTHOAI MADV DONVI #MADV TENDV

CREATE TABLE donvi( madv char(2) primary key, tendv char(20) not null )

CREATE TABLE nhanvien (

manv char(10) not null PRIMARY KEY hoten nvarchar(30) not null,

ngaysinh datetime null, diachi nvarchar(50) null,

dienthoai char(11) null, madv char(2) foreign key (madv) references donvi(madv) ON DELETE CASCADE ON UPDATE CASCADE )

CONSTRAINT f1_tt FOREIGN key(masv) REFERENCES sv(masv) ON DELETE CASCADE ON UPDATE CASCADE ,

CONSTRAINT f2_tt FOREIGN key(madt) REFERENCES dt(madt) ON DELETE CASCADE ON UPDATE CASCADE )

Ràng buộc UNIQUE

Thay vì sử dụng khóa chính, bạn có thể sử dụng ràng buộc UNIQUE để đảm bảo tính toàn vẹn thực thể. Sử dụng ràng buộc UNIQUE trên một (hay nhiều) cột bắt buộc các giá trị dữ liệu trên một (hay nhiều) cột này không đƣợc trùng lặp nhau. Để khai báo một ràng buộc UNIQUE, bạn sử dụng cú pháp sau:

[CONSTRAINT constraint_name]

UNIQUE[ colname[ ,colname2[...,colname16] ] ) ]

- Ràng buộc NOT NULL quy định các giá trị khi thêm vào cột trong bảng CSDL phải luôn luôn khác rỗng.

- Ràng buộc NULL cho phép các giá trị rỗng đƣợc thêm vào cột trong bảng CSDL, khi tạo bảng nếu không khai báo ràng buộc thì các cột đƣợc mặc định ràng buộc NULL. (adsbygoogle = window.adsbygoogle || []).push({});

9.5.4. Lệnh sửa đổi bảng(alter table)

 Đƣợc dùng để

- Thay đổi cấu trúc bảng - Thay đổi ràng buộc a. Thêm cột

Ví dụ: thêm vào bảng NHANVIEN cột NGHENHIEP

ALTER TABLE NHANVIEN ADD NGHENGHIEP nvarCHAR(20) b. Xóa cột

Ví dụ: Xóa cột NGHENGHIEP

ALTER TABLE NHANVIEN DROP COLUMN NGHENGHIEP c. Mở rộng cột

Ví dụ: Thay dổi kiểu dữ liệu của cột DCHI thành VARCHAR (60)

ALTER TABLE NHANVIEN ALTER COLUMN DCHI VARCHAR(60) d. Lệnh thêm RBTV

ALTER TABLE<Ten_bang>ADD ALTER TABLE<tên_bảng>ADD

<tên _cột><kiểu_dữ_liệu>[<RBTV>]

ALTER TABLE<tên_bảng>DROP COLUMN <tên_cột>

CONSTRAINT<Ten_RBTV><RBTV>, CONSTRAINT< Ten_RBTV><RBTV>, ...

e. Lệnh xóa RBTV

Ví dụ thay đổi ràng buộc toàn vẹn

Thêm ràng buộc khóa chính, ràng buộc khóa ngoại, ràng buộc mặc định và ràng buộc kiểm tra vào bảng NHANVIEN

ALTER TABLE PHONGBAN ADD

CONSTRAINT PB_MAPHG_PK PRIMARY KEY (MAPHG),

CONSTRAINT PB_TRPHG FOREIGN KEY (TRPHG)

REFERENCES NHANVIEN(MANV)

CONSTRAINT PB_NGNHANCHUC_DF DEFAULT GETDATE() FOR

NG_NHANCHUC, CONSTRAINT PB_TENPB_UNI UNIQUE(TENPB) f. Lệnh xóa bảng

Đƣợc dùng để xóa cấu trúc bảng. Tất cả dữ liệu của bảng đều bị xóa. Cú pháp:

DROP TABLE<Ten_bang> Ví dụ:

DROP TABLE PHONGBAN

9.6. Bài tập

Cho các bảng trong cơ sở dữ liệu quản lý vật tƣ ( hình vẽ ở dƣới )

Hãy tạo cơ sở dữ liệu có tên là Qly_vtu, tạo tất cả các bảng trong cơ sở dữ liệu quản lý vật tƣ trên và các ràng buộc toàn vẹn trên các bảng nếu có.

10.THỰC HÀNH CÂU LỆNH CREATE DATABASE, CREATE TABLE, ALTER TABLE, DROP TABLE

(adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Đề cương bài giảng học phần: Cơ sở dữ liệu (2014 - 2015) (Trang 80 - 86)