Thứ Ba, 26 tháng 5, 2015

SQL - Bài 8: Lấy giá trị cuối cùng trong cột đồng nhất

Từ bài học trước, chúng ta đã hiểu các giá trị của cột đồng nhất tự động được tạo. Có một số cách trong sql server, để lấy ra giá trị đồng nhất được tạo ra cuối cùng. Cách phổ biến nhất là sử dụng hàm  SCOPE_IDENTITY() đã biên dịch thành hàm.

Ngoài việc sử dụng SCOPE_IDENTITY() bạn cũng có thể sử dụng  biến toàn cục @@IDENTITY và hàm IDENT_CURRENT('TableName') 

Apart, from using SCOPE_IDENTITY(), you also have @@IDENTITY and IDENT_CURRENT('TableName') function. 

Ví dụ những truy vấn sau lấy ra giá trị cuối cùng của cột đồng nhất
Select SCOPE_IDENTITY()
Select @@IDENTITY
Select IDENT_CURRENT('tblPerson')

Bây giờ chúng ta cùng hiểu sự khác nhau giữa 3 cách tiếp cận:
@IDENTITY nếu trong table vừa insert vào có trigger thì nó sẽ trả về identity của bên table mà trigger tác động chứ không phải table bạn vừa Insert nhé
SCOPE_IDENTTY(): hàm có sẵn, trả về identity của table vừa Insert vào.
IDEN_CURRENT('table'): hàm có sẵn, cũng giống như SCOPE_IDENTITY() nhưng khác là không phụ thuộc vào session đang kết nối đến SQL Server.

Nguyên bản tiếng anh:
In brief:
SCOPE_IDENTITY() - returns the last identity value that is created in the same session and in the same scope.
@@IDENTITY - returns the last identity value that is created in the same session and across any scope.
IDENT_CURRENT('TableName') - returns the last identity value that is created for a specific table across any session and any scope.

SQL - Bài 7: Cột đồng nhất trong SQL Server

Nếu một cột được đánh dấu là cột đồng nhất, thì những giá tị của cột đó sẽ được phát sinh tự động, khi bạn chèn một dòng mới vào bảng. Sau đây, tạo dấu bảng báo cáo PersonId như là một cột đông nhất với gốc = 1 và giá trị đồng nhất là 1. Gốc và những giá trị gia tăng là tuy chọn. Nếu bạn không xác đinh chúng thì mặc định chúng sẽ bằng 1.

Create Table tblPerson
(
PersonId int Identity(1,1) Primary Key,
Name nvarchar(20)
)

Trong 2 câu lệnh Insert dưới đây, chúng ta chỉ thêm vào cột Name và không động tới cột PersonId.
Insert into tblPerson values ('Sam')
Insert into tblPerson values ('Sara')

Nếu bạn chọn tất cả các hàng từ tblPerson table, bạn sẽ nhìn thấy các dòng 'Sam' and 'Sara' có PersondId là 1 và 2.

Bây giờ, nếu tôi cố gắng thực thi theo truy vấn sau, tôi có một lỗi xảy ra  An explicit value for the identity column in table 'tblPerson' can only be specified when a column list is used and IDENTITY_INSERT is ON. 

Insert into tblPerson values (1,'Todd')

Như vậy nếu bạn đánh dấu một cột là identity column, bạn không cần phải cung cấp 1 giá trị nào đó cho cột khi bạn insert một dòng mới. Những giá trị đó sẽ tự động đươc tính toán và cung cấp bởi SQL server. Như vậy, insert 1 dòng vào bảng tblPerson , chỉ cần cung cấp giá trị của cột Name
Insert into tblPerson values ('Todd')

Xóa hàng mà bạn vừa chèn vào và chèn vào một dòng khác. Bạn thấy đấy, giá trị của PersonId giờ là 2. Bây giờ chèn thêm một dòng kahcs, PersonId bằng 3. Một bản ghi với PersonId là 1 nó không tồn tại và giờ tôi muốn lấp đầy khoảng trống này. Để làm được điều này, chúng ta sẽ cung cấp một cách rỏ ràng giá trị cho cột đồng nhất.
1. Đầu tiên bật indentity insert lên - SET Identity_Insert tblPerson ON
2. Trong câu truy vấn Insert chỉ đích danh cột
 Insert into tblPerson(PersonId, Name) values(2, 'John')

Chừng nào mà Identity_Insert đang bật trên một bảng, bạn cần xác định chính xác giá trị cung cấp cho cột. Nếu không xác định chính xác giá trị, sẽ có lỗi:  Explicit value must be specified for identity column in table 'tblPerson1' either when IDENTITY_INSERT is set to ON or when a replication user is inserting into a NOT FOR REPLICATION identity column. 

Sau đó, bạn lấp đầy các khoảng trống trên cột đồng nhất, và bạn biết rằng SQL server có thể tính toán giá trị, tắt Identity_Insert
SET Identity_Insert tblPerson OFF

Nếu bạn xóa tất cả các dòng trong 1 bảng, và bạn muốn reset giá trị cột Identity, sử dụng câu lệnh DBCC CHECKIDENT. Câu lệnh này sẽ reset lại cột đồng nhất PersonId
DBCC CHECKIDENT(tblPerson, RESEED, 0)

SQL - Bài 6: Ràng buộc Check trong SQL

Check constraint được sử dụng để giới hạn phạm vi của các giá trị trong SQL có thể được nhập vào trong một cột.

Chúng ta có một cột AGE , trong 1 bảng. Cột AGE nói chung là không thể nhỏ hơn 0 và không thể lớn hơn 150. Nhưng, khi AGE là 1 cột giá trị integer nó chấp nhận giá trị âm và lớn hơn rất nhiều so với 150.

Vậy nên, để giới hạn các giá trị được thêm vào, chúng ta có thể sử dụng Check constraint. Trong SQL Server, Check constraint có thể được tạo ra bằng 2 cách, sử dụng màn hình đồ họa hoặc sử dụng câu lệnh truy vấn query.

Check constraint dưới đây giới hạn tuổi từ 0->150
ALTER TABLE tblPerson
ADD CONSTRAINT CK_tblPerson_Age CHECK (Age > 0 AND Age < 150)

Công thức chung để thêm check constraint vào trong SQL Server:
ALTER TABLE { TABLE_NAME }
ADD CONSTRAINT { CONSTRAINT_NAME } CHECK ( BOOLEAN_EXPRESSION )


Nếu biểu thức BOOLEAN_EXPRESSION trả về true, thì Check constraint cho phép giá trị đó, mặt khác nó không cho phép. 


Truy vấn để xóa một  CHECK constraint:
ALTER TABLE tblPerson
DROP CONSTRAINT CK_tblPerson_Age

SQL - Bài 5: Các ràng buộc toàn vẹn

Trong phần 3 của series học SQL, chúng ta đã biết cách tạo ra các bảng (tblPerson and tblGender) và thực thi các ràng buộc khóa chính và khóa ngoại. Trong phần 4 chúng ta lại được học về các ràng buộc mặc định. Bạn nên xem lại phần 3 và phần 4 trước khi học bài hôm nay.


Cascading ràng buộc toàn vẹn cho phép xác định các hành động của Microsoft SQL Server nên thực hiện khi người dùng cố gắng xóa hoặc update một khóa mà nó tồn tại các khóa ngoại tham chiếu đến.

Ví dụ, hãy xem xét 2 bảng bên dưới. Nếu bạn xóa dòng với ID = 1 trong bảng tblGender, sau đó dòng với ID = 3 tỏng bảng tblPerson sẽ là một bản ghi thiếu mất gốc (nói cho dễ hiểu là trẻ mồ côi ấy ^^). bạn sẽ không thể nói Gender sẽ như thế nào cho bảng này. Cascading ràng buộc toàn vẹn có thể được sử dụng để định nghĩa các hành động của Microsoft SQL Server khi điều này xảy ra. Theo mặc định chúng ta nên xóa hoặc update.


Tuy nhiên, bạn có những lựa chọn sau đây khi cài đặt Cascading ràng buộc toàn vẹn
1. No Action: là hành vi mặc định. Không có quy định một hành động để cố xóa hoặc update 1 dòng với 1 khóa được tham chiếu tới các khóa ngoại trong các hàng tồn tại trong các bảng khác. Một lỗi được nêu ra và lênh DELETE hoặc UPDATE được quy thành roll back (thao tác lùi cơ sở dữ liệu về một trạng thái cũ)

2. Cascade:  Nó chỉ định rằng nếu một nổ lực để xóa hoặc update một dòng với một khóa có nhiều khóa ngoại tham chiếu tới từ các bảng khác, tất cả các dòng chứa khóa ngoại cũng sẽ bị xóa hoặc update.

3. Set NULL: Nó chỉ định rằng nếu một nổ lực để xóa hoặc update một dòng với một khóa có nhiều khóa ngoại tham chiếu tới từ các bảng khác. Tất cả các dòng chứa khóa ngoại tham chiếu đến sẽ được gán cho giá trj NULL.

4. Set Default: Nó chỉ định rằng nếu một nổ lực để xóa hoặc update một dòng với một khóa có nhiều khóa ngoại tham chiếu tới từ các bảng khác.Tất cả các dòng chưa khóa ngoại tham chiếu đến đều sẽ được gán cho 1 giá trị mặc định.


SQL - Bài 4: Ràng buộc mặc định

Trong phần 3 của series học SQL, chúng ta đã biết cách tạo ra các bảng (tblPerson and tblGender) và thực thi các ràng buộc khóa chính và khóa ngoại. Bạn nên xem lại phần 3 trước khi học tiếp bài học này.


Trong phần này chúng ta sẽ học cách thêm vào ràng buộc măc đinh. Một cột mặc định có thể được chỉ định sử dụng ràng buộc mặc định. Các ràng buộc mặc định được sử dụng để chèn các giá trị mặc định vào cột. Các giá trị mặc định sẽ được thêm vào tất cả các dòng mới. Nếu không có giá trị xác định nó sẽ tự động thêm vào NULL.

Thay đổi một cột hiện có bằng các thêm vào ràng buộc mặc định
ALTER TABLE { TABLE_NAME }
ADD CONSTRAINT { CONSTRAINT_NAME }
DEFAULT { DEFAULT_VALUE } FOR { EXISTING_COLUMN_NAME }

Thêm một cột mới với giá trị mặc định vào một bảng hiện có
ALTER TABLE { TABLE_NAME } 
ADD { COLUMN_NAME } { DATA_TYPE } { NULL | NOT NULL } 
CONSTRAINT { CONSTRAINT_NAME } DEFAULT { DEFAULT_VALUE }

Các lệnh sau đây sẽ thêm vào ràng buộc mặc định DF_tblPerson_GenderId
ALTER TABLE tblPerson
ADD CONSTRAINT DF_tblPerson_GenderId
DEFAULT FOR GenderId

Câu lênh chèn dữ liệu dưới đây không cung cấp giá trị cho cột GenderID, vậy nên mặc định giá trị của nó sẽ là 1 theo ràng buộc trên. 
Insert into tblPerson(ID,Name,Email) values(5,'Sam','s@s.com')


Mặc khác, lệnh chèn sau đây sẽ thêm vào NULL, thay vì sử dụng mặc định.
Insert into tblPerson(ID,Name,Email,GenderId) values (6,'Dan','d@d.com',NULL)

Câu lệnh để xóa một ràng buộc
ALTER TABLE { TABLE_NAME } 
DROP CONSTRAINT { CONSTRAINT_NAME }

















SQL - Bài 3: Tạo và làm việc với bảng

Mục đích của bài viết này là tạo ra 2 bảng tblPerson and tblGender  và thiết lập khóa chính và các ràng buộc khóa ngoại. Trong SQL Server, các bảng cỏ thể được tạo bằng cách sử dụng màn hình đồ họa sử dụng SQL Server Management Studio (SSMS) hoặc sử dụng câu lệnh truy vấn.

Tạo bảng tblPerson trên màn hình đồ họa, sử dụng SQL Management Studio (SSMS)
1. Click chuột phải vào Tables folder trong cửa sổ Object explorer
2. Chọn New Tables
3. Điền Column Name(tên cột), Data Type (kiểu dữ liệu), và All Nulls (cho phép Null hay không) và lựu lại với tên tblPerson

Các lệnh dưới tạo bảng tblGender, với 2 cột ID và Gender. Cột ID là khóa chính (primary key). Khóa chính được tạo để xác định thuộc tính duy nhất của một bảng nhằm phân biệt với các bảng khác (khóa chính có thể gồm một hoặc nhiều thuộc tính), khóa chính không được phép Null. 
Create Table tblGender
(ID int Not Null Primary Key,
Gender nvarchar(50))

Trong bảng tblPerson thuộc tính GenderID là khóa ngoại (foreign key) referencing đến cột ID trong bảng tblGender. Khóa ngoại có thể được tạo bằng cách sử dụng SSMS hoặc dùng câu lệnh truy vấn.

Cách sử dụng màn hình giao diện để thiết lập khóa ngoại
Phương pháp này khá dài dòng và không hữu dụng nên tôi sẽ bỏ qua, bạn nào muốn có thể tìm hiểu thêm.

Cách sử dụng cậu lệnh truy vấn SQl để tạo ràng buộc khóa ngoại
Alter table tblPerson 
add constraint tblPerson_GenderId_FK FOREIGN KEY (GenderId) references tblGender(ID)
To add a foreign key reference using a query


Công thức chung ở đây là:
Alter table ForeignKeyTable add constraint ForeignKeyTable_ForiegnKeyColumn_FK 
FOREIGN KEY (ForiegnKeyColumn) references PrimaryKeyTable (PrimaryKeyColumn)

Khóa ngoại được sử dụng để thực thi trọn vẹn cơ sở dữ liệu. Một khóa ngoại trong một bảng chỉ tới khóa chính trong bảng khác. Các ràng buộc khóa ngoại ngăn không cho dữ liệu không hợp lệ đưa vào các cột bên ngoài. Các giá trị nhập vào một cột ở bên ngoài phải là một trong những giá trị khóa chính trỏ tới










Thứ Bảy, 23 tháng 5, 2015

SQL - Bài 2: Tạo, thay đổi và xóa một cơ sở dữ liệu

Trong phần một của SQL Server, chúng ta đã thấy cách sử dụng SSMS để kết nối với SQL Server. Trong phần này, chúng ta sẽ học cách tạo, sửa, và xóa một cơ sở dữ liệu.

Một cơ sở dữ liệu SQL Server có thể được tạo, sửa và xóa theo 2 cách

1. Trên đồ thị sử dụng SQL Server Management Studio (SSMS) hoặc
2. Sử dụng Query, câu lệnh truy vấn

Tạo cơ sở dữ liệu bằng cách sử dụng đồ thị nhánh
1. Click chuột phải vào Databases folder trong Object explorer
2. Chọn New Database
3. Trong ộp thoại New Database, nhập  vào tên  Database  và click OK

Tạo cơ sở dữ liệu sử dụng câu lệnh truy vấn
Create database DatabaseName
Cho dù bạn tạo một sở sở dữ liệu bằng cách nào thì 2 tập tin sau đây cũng được tạo ra
.MDF file - Tập tin dữ liệu (chứa dữ liệu thực tế)
.LDF file -  Transaction Log file (dùng để khôi phục lại cơ sở dữ liệu)

Để thay đổi tên một cơ sở dữ liệu khi nó đã được tạo ra
Alter database DatabaseName Modify Name = NewDatabaseName

Ngoài ra bạn cũng có thể sử dụng hệ thống Store Procedure
Execute sp_renameDB 'OldDatabaseName','NewDatabaseName'

Để xóa hoặc bỏ một cơ sở dữ liệu
Drop Database DatabaseThatYouWantToDrop

Xóa một database tức là xóa 2 file .LDF và .MDF

Bạn không thể xóa 1 database, nếu nó vẫn đang trong quá trình sử dụng. Lúc đó bạn sẽ gặp phải lỗi -  Cannot drop database "NewDatabaseName" because it is currently in use. Vậy nên, nếu người dùng khác kết nối, bạn cần đặt sơ sở dữ liệu trong chết độ single user rồi sau đó mới xóa nó.
Alter Database DatabaseName Set SINGLE_USER With Rollback Immediate

Với RollBack thì ngay lập tức nó sẽ đóng tất cả các kết nối tới database.

Chú ý: Hệ thống các cơ sở dữ liệu không thể bị xóa.