Chương 6 Quản lý bảng trong SQL Server Mục tiêu: Kết thúc chương, học viên có thể: Nắm được các bước tạo một bảng Hiểu được các kiểu dữ liệu trong SQL Server Định nghĩa được các ràng
Trang 1Chương 6 Quản lý bảng trong SQL Server
Mục tiêu:
Kết thúc chương, học viên có thể:
Nắm được các bước tạo một bảng
Hiểu được các kiểu dữ liệu trong SQL Server
Định nghĩa được các ràng buộc toàn vẹn và hiểu được ý nghĩa của các ràng buộc
Biết được cách cập nhật và xoá một bảng bằng cách sử dụng T-SQL và Enterprise Manager
Hiểu được các khái niệm liên quan đến ràng buộc và các đối tượng ràng buộc
Trong bài trước, ta đã xem xét những tính năng của hệ quản trị CSDL quan hệ (RDBMS) SQL Server Chúng ta đã biết các cách khác nhau để kích hoạt Enterprise Manager, cách khởi động và dừng SQL Server Việc đặt cấu hình cho SQL Server với nhiều tùy chọn khác nhau cũng là phần quan trọng trong bài trước Chúng ta cũng đã xem xét cách tạo, xóa và copy CSDL
6.1.1
CSDL và bảng CSDL
Một bảng là một tập hợp các bản ghi có quan hệ với nhau được xếp thành các hàng và cột Mỗi CSDL bao gồm một số bảng, mỗi bảng chứa một tập hợp dữ liệu liên quan Các bảng trong một CSDL có quan hệ với nhau
Chúng ta hãy xem xét một CDSL dùng để lưu trữ dữ liệu của một “Hệ thống đặt vé máy bay” Những thông tin chi tiết của các hành khách, người đã đặt vé, có thể được lưu trong bảng Reservation Trong khi những thông tin về việc huỷ vé có thể được lưu trong bảng
“Cancellation” Hơn nữa, ngày và giờ của các chuyến bay có thể được lưu trong một bảng khác Danh sách vé cũng được lưu trong một bảng khác Tất cả các bảng liên quan đến đặt chỗ vé bay
được lưu trong một CSDL “Airlines”.
Mặt khác, bảng chứa thông tin về việc nghỉ phép của nhân viên của hãng hàng không không phù hợp với CSDL này, vì nó không liên quan gì đến việc đặt vé máy bay
6.1.2
Thiết kế bảng và CSDL
Một việc rất quan trọng khi thiết kế CSDL là phải tạo được mô hình CSDL mức khái niệm (còn gọi là “blueprint” hay “Conceptual model”) Mô hình bản thiết kế CSDL phải đảm bảo CSDL đó
có thể đáp ứng được những nhu cầu hiện tại và sau này của doanh nghiệp
Người thiết kế CSDL phải nhớ rằng mô hình CSDL mức khái niệm không phụ thuộc vào mô hình CSDL (dù là mô hình phân cấp, mô hình mạng hay mô hình quan hệ) Thêm nữa, Mô hình CSDL mức khái niệm của CSDL cũng không được phụ thuộc vào ứng dụng, phần cứng, phần mềm để đảm bảo chỉ có những thông tin cần thiết và đúng đắn được lưu trữ trong CSDL
Trang 2Khi thiết kế CSDL, ta phải xác định những bảng nào cần thiết, mỗi bảng sẽ lưu trữ dữ liệu nào, ai được phép truy nhập vào từng bảng, … Ở phần tạo và làm việc với bảng, ta sẽ xem xét chi tiết hơn
Cách hiệu quả nhất để định nghĩa bảng là tạo ra tất cả những gì cần thiết cho bảng tại thời điểm tạo bảng, bao gồm các ràng buộc dữ liệu, và một số các thành phần khác Tuy nhiên trong một số trường hợp bạn cũng có thể tạo ra một bảng có thể chưa đầy đủ, thêm một ít dữ liệu vào đó, sau
đó thử làm việc trên bảng đó Cách thức này giúp chúng ta nhận thấy những kiểu giao dịch nào thường xuyên xẩy ra và những kiểu dữ liệu nào thường xuyên được nhập vào bảng trước khi chúng ta chấp nhận thiết kế đó của bảng
Chúng ta nên phác thảo cấu trúc của bảng trên giấy trước khi tạo bảng Có một vài điểm cần nhớ khi tạo bảng là:
Bảng sẽ chứa những kiểu dữ liệu gì
Các trường trong bảng và kiểu dữ liệu của từng trường (và kích thước của trường nếu cần thiết)
Những trường nào chấp nhận giá trị Null?
Tên trường
Trường nào cần đặt giá trị mặc định và xác định các điều kiện để đảm bảo dữ liệu hợp lệ cho trường
Trường nào cần đặt index và xác định loại index phù hợp cho trường đó Xác định những trường nào là khóa chính, trường nào là khóa ngoại
Giá trị mặc định, khoá chính, khoá ngoại sẽ được giới thiệu chi tiết trong phần sau của chương này
6.1.3
Chuẩn hoá dữ liệu
Chuẩn hóa là quá trình loại bỏ những dữ liệu dư thừa (hoặc không mong muốn) từ dữ liệu đầu vào Hãy xem CSDL như một tủ quần áo Chúng ta nên phân loại chúng như: quần, áo, cà vạt, tất, và xếp chúng ở những ngăn riêng biệt Nếu chúng ta để tất không thành đôi ở nhiều nơi khác nhau, chúng ta sẽ không bao giờ tìm thấy một đôi để đi vào buổi sáng hôm sau Nếu chúng ta để lẫn cả cà vạt và tất, ta cũng sẽ rất khó tìm và đi chúng trong một thời gian ngắn Cho nên tất cả dữ liệu phải được nhóm vào nhau một cách phù hợp, giống như tất phải để thành đôi Không nên để bất kì dữ liệu không phù hợp vào trong bảng Dữ liệu liên quan với nhau cũng phải được đặt vào một bảng thích hợp Chuẩn hóa là một kĩ thuật giúp người dùng nhóm các dữ liệu liên quan với nhau và đặt dữ liệu đó vào trong một bảng phù hợp Do đó, chúng ta phải chuẩn hóa CSDL trước khi bắt đầu làm việc với nó Có một số dạng chuẩn hóa đã được công nhận và được sử dụng rộng rãi
Một CSDL chuẩn hoá nên có những đặc trưng sau:
Chú ý : NULL là một mục mà không được gán giá trị một cách tường minh NULL không
phải bằng với 0 hoặc trắng Vì vậy hai giá trị Null là không bằng nhau
Trang 3 Mỗi bảng phải có một trường khoá.
Không được có các trường trùng nhau
Mỗi bảng phải chứa thông tin về một thực thể đơn Thực thể có thể là một địa điểm, đối tượng, sự kiện hoặc một con người Ví dụ: Các quyển sách, Giáo viên, Nhân viên
Mỗi trường trong bảng phải phụ thuộc vào khoá chính
Tất cả các trường không là khoá chính phải độc lập với nhau
Khi nào thì dùng chuẩn hoá?
Chuẩn hóa được áp dụng trong những tình huống sau:
Dữ liệu nhiều và nằm rải rác
Không có nhóm dữ liệu được định nghĩa
Dữ liệu quá phức tạp
Bước đầu tiên để xây dựng ứng dụng CSDL
Sau khi cấu trúc bảng đã được xác định, bảng có thể được tạo Dữ liệu thường được lưu trong các bảng cố định Bất kì người dùng nào có quyền phù hợp đều có thể sử dụng bảng, bảng sẽ tồn tại trong CSDL cho đến khi chúng bị xóa đi
6.2.1
Tạo bảng với Enterprise Manager hoặc T-SQL
Một bảng có thể được tạo bằng cách dùng:
Enterprise Manager hoặc
Các câu lệnh Transact-SQL trong Query Analyzer
Cú pháp để tạo một bảng sử dụng T-SQL là:
CREATE TABLE <Table_Name>
(<Column_Name> <Data_Type>)
Ví dụ:
CREATE TABLE Airlines_Master
(Aircode CHAR(2),
Airline_name VARCHAR(15))
Chúng ta có thể tạo một bảng mới với Enterprise Manager bằng cách chọn CSDL và sau đó chọn các lựa chọn Action, New và Table.
Trang 4Figure 6.1: Tạo một bảng mới
Khi chọn Table, cửa sổ thiết kế hiện lên để ta có thể nhập vào cấu trúc của bảng Giả sử
chúng ta muốn tạo một bảng tên là ‘Airlines_master’ có hai trường ‘Air code’ và
‘Airline_name’ Chúng ta nhập vào tên trường, độ rộng và các kiểu dữ liệu cho hai trường
này và lưu bảng với tên là Airlines_master.
Figure 6.2: Adding fields to a table 6.2.2
Kiểu dữ liệu và ràng buộc toàn vẹn
Kiểu dữ liệu là một trong những điều quan trọng nhất của T-SQL Dữ liệu trong một bảng của
SQL Server 2000 được định nghĩa bởi kiểu dữ liệu của nó Nó chỉ rõ loại thông tin nào có thể được lưu trong một cột
Khi tạo bảng, đầu tiên chúng ta phải xác định kiểu dữ liệu cho từng trường trong bảng Kiểu dữ liệu xác định những giá trị cho phép lưu vào trường Ví dụ, nếu chúng ta chỉ muốn lưu tên vào
Trang 5một trường, chúng ta có thể đặt kiểu dữ liệu ‘character’ cho trường đó Nếu chúng ta muốn một trường nào đó chỉ lưu các giá trị số, ta đặt kiểu dữ liệu của trường đó là ‘numeric’
Các kiểu dữ liệu hệ thống là những kiểu dữ liệu do SQL Server 2000 cung cấp Những kiểu dữ liệu này đều chỉ rõ số lượng byte được cấp phát đề lưu trữ dữ liệu, và dạng dữ liệu nào có thể được lưu trữ
Xác định một kiểu dữ liệu cho trường đảm bảo rằng chỉ có kiểu dữ liệu đó mới được lưu vào trong trường
Ví dụ, ‘TWO’ không thể được lưu vào trong trường có kiểu dữ liệu là ‘int’ Nhưng số 2 có thể được lưu vào trường có kiểu dữ liệu là ‘character’ hoặc ‘int’.
Hình 6.3 mô tả các kiểu dữ liệu khác nhau trong SQL Server 2000
Figure 6.3: SQL Server data types
Một số kiểu dữ liệu hệ thống thường được dùng được liệt kê trong bảng sau
Kiểu dữ liệu binary - Kiểu dữ liệu
binary bao gồm các số hecxa Có ba
dạng của kiểu dữ liệu binary
Binary:
Cú pháp: binary [(n)]
Varbinary:
Cú pháp: varbinary [(n)]
Image:
Cú pháp: image
char
varchar
nchar
nvarchar
text
ntext
char varchar
char
varchar
nchar
nvarchar
char varchar nchar
char
char
cha
char varchar nchar nvarchar
char varchar nchar nvarchar
char varchar
char
Trang 6Kiểu dữ liệu Text – Kiểu dữ liệu ký
tự bao gồm một tổ hợp các chữ cái,
các ký hiệu hoặc các chữ số
Kiểu dữ liệu Nchar và nvarchar lưu
kí tự theo tiêu chuẩn Unicode
Char:
Cú pháp:char [(n)]
Varchar:
Cú pháp: varchar [(n)]
Nchar:
Cú pháp: nchar [(n)]
Nvarchar:
Cú pháp: nvarchar [(n)]
Text:
Cú pháp: text
Ntext:
Cú pháp: ntext
Date và time – Dữ liệu ngày tháng
được đặt trong dấu nháy đơn Thứ tự
giữa chúng không quan trọng Có thể
đặt ngày tháng truớc thời gian hoặc
ngược lại
Datetime:
Cú pháp : datetime
Smalldatetime
Cú pháp: Smalldatetime
Dữ liệu Numeric – Dữ liệu này chỉ
bao gồm các số Nó gồm các số
dương, số âm, và số thập phân
Dữ liệu Integer: Bao gồm các
số nguyên dương và nguyên
âm, như -15, 0, 5, 2509 Có bốn dạng khác nhau của kiểu dữ liệu Integer
int, smallint, tinyint, bigint.
Dữ liệu Decimal: float, real Kiểu dữ liệu Monetary - Kiểu dữ
liệu Monetary (tiền tệ) lưu trữ các giá
trị tiền tệ với độ chính xác là bốn chữ
số sau dấu phẩy
Money:
Cú pháp: Money
Smallmoney:
Cú pháp: smallmoney
Kiểu dữ liệu Bit – Kiểu dữ liệu này
có thể lưu giá trị 1 hoặc 0
Bit:
Cú pháp:Bit
sql_variant – Đây là kiểu dữ liệu
lưu giá trị của các kiểu dữ liệu khác
trong SQL Server 2000
sql_variant:
Cú pháp:Sql_variant
Bảng 6.1: Các kiểu dữ liệu của SQL Server
Toàn vẹn dữ liệu đóng một vai trò rất quan trọng trong một môi trường RDBMS lớn có nhiều người cùng sử dụng Chúng ta không thể mong đợi người sử dụng sẽ nhập những dữ liệu đúng đắn Do đó, trong khi tạo bảng, chúng ta phải chú ý và đảm bảo chỉ những dữ liệu hợp lệ mới được phép nhập vào CSDL
Toàn vẹn dữ liệu (Data integrity) chỉ sự tin cậy và chính xác của dữ liệu Các qui tắc toàn vẹn
dữ liệu (Integrity rules) được thiết lập để đảm bảo dữ liệu nhất quán và chính xác Những qui tắc
Trang 7này sẽ thực hiện việc kiểm tra dữ liệu đầu vào, chỉ những dữ liệu hợp lệ mới cho phép lưu trữ
Chúng ta thường nghe câu châm ngôn “ “ Garbage in, garbage out” ” Lí do chính mà chúng ta
dùng một CSDL để lưu trữ dữ liệu mà không dùng các bảng tính hoặc bộ xử lí văn bản là vì nó ngăn không cho lưu trữ những dữ liệu vô nghĩa (dữ liệu rác hoặc dữ liệu không chính xác) Điều này được thực hiện bằng việc sử dụng toàn vẹn dữ liệu Mọi DBMS hay RDBMS đều hỗ trợ nhiều công cụ cho việc duy trì sự toàn vẹn dữ liệu
Chú ý: Toàn vẹn dữ liệu đảm bảo rằng tất cả dữ liệu lưu trữ trong CSDL là hợp lệ CSDL sẽ
mất tính toàn vẹn dữ liệu của nó khi nó cho phép lưu trữ những dữ liệu không hợp lệ
Việc thực hiện toàn vẹn dữ liệu đảm bảo sự đúng đắn và chính xác của dữ liệu trong CSDL Ví
dụ, nếu một Employee ID (mã nhân viên) trong bảng Employee (Nhân viên) được nhập là “123”, CSDL sẽ không cho phép lưu trữ một bản ghi khác mà Employee ID có cùng giá trị, vì không thể
có hai nhân viên có cùng một số ID Nếu chúng ta có trường Employee-rating chỉ có thể nhận các
giá trị từ 1 đến 5, CSDL khi đó sẽ không cho phép lưu trữ giá trị 6 vào trong trường đó Nếu bảng
đó có trường Department để lưu thông tin về phòng ban của nhân viên, CSDL khi đó sẽ chỉ cho
phép những phòng ban nào có trong công ty mới được phép lưu vào trường
Toàn vẹn dữ liệu có thể phân làm bốn loại như hình vẽ 6.4
Hình 6.4: Các kiểu toàn vẹn dữ liệu
Ý tưởng cơ bản của Toàn vẹn Thực thể (Entity integrity) là chúng ta phải có khả năng xác định
được mỗi thực thể lưu trong CSDL Thực thể là bất kỳ cái gì tồn tại trong thế giới thực Nó có thể
là một đối tượng, một chủ đề, hoặc một sự kiện được lưu trong CSDL
Bảng được tạo ra để lưu trữ thực thể, các trường trong bảng thể hiện các thuộc tính của thực thể
Toàn vẹn thực thể định nghĩa mỗi dòng trong bảng là một thực thể duy nhất trong bảng đó Khi
chúng ta đưa một thực thể (bản ghi) vào bảng, điều quan trọng là thực thể đó phải được xác định duy nhất trong bảng để chúng ta có thể truy xuất nó và thay đổi dữ liệu trên nó
Xác định khóa chính là bước đầu tiên thực hiện toàn vẹn thực thể Sau đó chúng ta sẽ xác định khóa ngoại cho bảng
Thuật ngữ Domain (miền) chỉ một tập hợp các giá trị được phép lưu vào trường.
Ví dụ, một yêu cầu trên trường age của bảng Employee là chỉ nhận các giá trị từ 18 đến 58 Ta
biết Toàn vẹn thực thể (Entity Integrity) kiểm tra sự hợp lệ dữ liệu của thực thể, toàn vẹn miền
Toàn vẹn dữ liệu
Toàn vẹn
thực thể
Toàn vẹn miền
Toàn vẹn tham chiếu
Toàn vẹn do người dùng định nghĩa
Trang 8(Domain Integrity) đảm bảo các yêu cầu về dữ liệu trên một trường cụ thể Toàn vẹn miền xác
định sự hợp lệ của dữ liệu trên một trường đã cho Toàn vẹn miền được mô tả trong hình 6.5
Hình 6.5: Toàn vẹn miền
Có thể xem toàn vẹn miền như là các quy tắc về nghiệp vụ (business rules) trên một trường Ở mức đơn giản nhất, kiểu dữ liệu trên trường cũng thực hiện chức năng của toàn vẹn miền Ví dụ chuỗi kí tự ‘two’ không được phép lưu vào một trường có kiểu dữ liệu numeric Để hạn chế việc đưa những dữ liệu không đúng đắn vào CSDL, chúng ta cần đặt ra những qui tắc dữ liệu hợp lệ trên bất kì trường nào
Toàn vẹn tham chiếu (Referential integrity) duy trì mối quan hệ giữa các bảng khi các bản ghi
bị thay đổi Toàn vẹn tham chiếu đảm bảo các giá trị khóa luôn nhất quán trên các bảng Một trong những yêu cầu để đảm bảo tính nhất quán là nếu một giá trị khóa bị thay đổi, tất cả các tham chiếu đến nó cũng được thay đổi theo Ví dụ, nếu một bác sĩ thôi không làm việc trong bệnh viện nữa, chắc chắn sẽ không sắp xếp lịch hẹn gặp của bệnh nhân với bác sĩ đó Nếu trường ID
trong bảng Physicians bị thay đổi, thì nó cũng sẽ làm thay đổi các bản ghi liên quan trong bảng Appointment để đảm bảo không có bản ghi nào trong bảng Appointment bị mồ côi.
SQL Server 2000 cung cấp rất nhiều các công cụ khác nhau để thực hiện toàn vẹn dữ liệu Chúng được liệt kê trong bảng 6.2
Toàn vẹn thực thể 1 PRIMARY KEY constraint
2 UNIQUE constraint
3 IDENTITY columns Toàn vẹn miền 1 DEFAULT definition
2 FOREIGN KEY constraint
3 CHECK constraint
4 NOT NULL property Toàn vẹn tham chiếu 1 FOREIGN KEY constraint
2 CHECK constraint Toàn vẹn do người dùng
định nghĩa 1 Rules2 Stored Procedures
3 Triggers
Bảng 6.2: Các công cụ của SQL Server đảm bảo tính toàn vẹn dữ liệu
Age
Miền xác định
Các giá trị nằm ngoài miền XĐ
Trang 9SQL Server 2000 đưa ra ba cơ chế để thực hiện Toàn vẹn thực thể Đó là khóa chính (PRIMARY KEY), ràng buộc duy nhất (UNIQUE constraint), thuộc tính Identity (IDENTITY property) Từng
cơ chế sẽ được giải thích chi tiết dưới đây
Ràng buộc khoá chính
Một bảng có một trường hoặc kết hợp nhiều trường mà giá trị của chúng dùng để xác định tính duy nhất của một bản ghi trong bảng Khi một trường đơn có thể phân biệt được từng bản ghi
trong bảng, nó được gọi là khóa chính (Primary key) của bảng, và sẽ đảm bảo tính toàn vẹn
thực thể trên bảng đó Khi có nhiều hơn một trường cùng kết hợp để xác định tính duy nhất của
một bản ghi trong bảng, như vậy khóa chính của bảng gồm nhiều trường và được gọi là khóa kết
hợp (Composite key)
Một bảng bao giờ cũng có khóa chính Ràng buộc khóa chính đảm bảo các bản ghi trong bảng
là duy nhất
Xác định khoá chính
Đối với người phát triển, việc lựa chọn đúng trường khóa chính cho bảng là rất quan trọng Khóa chính của bảng có thể là một trường đơn, hay nhiều trường Yêu cầu dữ liệu của trường khóa chính phải là duy nhất, không được trùng nhau đối với tất cả các bản ghi trong bảng (bao gồm cả
các bản ghi sẽ được thêm vào sau này) Tất cả các trường thỏa mãn yêu cầu trên gọi là Candidate
key.
Ví dụ, trong bảng Employee, mã số nhân viên có thể là một candidate key, nhưng cũng có thể thay nó bằng số chứng minh thư, hay kết hợp của số chứng minh thư và cấp bậc Điều này được minh họa trong hình 6.6
Bảng Employee
Hình 6.6: Xác định Candidate key
Vậy chúng ta chọn khóa chính như thế nào từ các candidate key? Có hai yếu tố có thể xem xét khi
chúng ta đưa ra quyết định là: tính tối thiểu và tính ổn định (minimality and stability.)
Khóa tổi thiểu (Minimal key) là loại khóa có số lượng trường ít nhất Do đó, nếu chúng ta phải lựa
chọn khóa chính giữa một trường đơn và nhiều trường thì ta nên chọn trường đơn làm khóa chính hơn Vì việc thao tác dữ liệu trên một trường sẽ nhanh hơn trên nhiều trường Tuy nhiên cũng có
Candidate key Candidate key Candidate key
Trang 10các ngoại lệ ví dụ như thao tác dữ liệu trên hai trường có kiểu integer sẽ nhanh hơn trên một
trường có kiểu Varchar với kích thước lớn
Tính ổn định (Stability) là một đặc tính của dữ liệu trong một trường Vì khóa chính dùng để đặt
quan hệ giữa hai bảng, cho nên một điều quan trọng là không nên thay đổi thường xuyên dữ liệu trong trường khóa chính Một cách lí tưởng là nó không bao giờ thay đổi
Khi bạn đã chọn được khóa chính từ các candidate key, các candidate key còn lại gọi là Alternate
key.
Tạo và sửa một khoá chính
Một ràng buộc khoá chính đơn có thể là:
Được tạo ngay khi định nghĩa bảng
Cú pháp:
CREATE TABLE Table_name
<Column_definition> PRIMARY KEY
Ví dụ:
CREATE TABLE Reservation
( PNR_no int PRIMARY KEY )
Câu lệnh này sẽ tạo một ràng buộc khoá chính cho cột PNR_no trong bảng Reservation.
Đưa thêm vào một bảng đã tồn tại, nếu bảng đó chưa có ràng buộc khoá chính Nhớ rằng một bảng chỉ có thể có một ràng buộc khoá chính
Cú pháp:
ALTER TABLE Table_name
ADD CONSTRAINT <Constraint_name>
PRIMARY KEY (<Column_name>)
Ví dụ:
ALTER TABLE Reservation
ADD CONSTRAINT PK_const
PRIMARY KEY (PNR_no)
Thay đổi hoặc xoá khóa chính nếu nó đã tồn tại Nếu chúng ta muốn thay đổi khóa chính, trước tiên chúng ta phải xoá khoá chính đó đi rồi tạo lại
Một vài điểm cần chú ý khi tạo một khoá chính
Khi một ràng buộc khóa chính được đưa vào một bảng đã có dữ liệu, SQL Server 2000 sẽ kiểm tra những dữ liệu trên các trường khóa chính để đảm bảo rằng không có các giá trị
trùng nhau hay tồn tại các giá trị null Nếu các trường khóa chính có chứa các giá trị null
hay các giá trị trùng nhau, SQL Server 2000 sẽ trả về một lỗi và không đặt ràng buộc khóa chính đó cho bảng.