Các Loại Ràng Buộc Trong SQL Server

Vũ Huy Tâm

Ràng buộc trong SQL Server được dùng để duy trì tính nhất quán của dữ liệu, đảm bảo dữ liệu phù hợp với các qui định theo yêu cầu của bài toán. Ví dụ một database về bán hàng đòi hỏi mỗi bản ghi phải có ID sản phẩm hợp lệ, số lượng bán phải là một số nguyên và giá bán phải lớn hơn 0. Đó là các yêu cầu về tính nhất quán của dữ liệu và các ràng buộc cần được khai báo để thực thi các yêu cầu này. Do đó, ràng buộc giúp ngăn chặn dữ liệu không hợp lệ và chỉ cho phép dữ liệu hợp lệ được lưu vào database.
SQL Server cung cấp các loại ràng buộc sau:

PRIMARY KEY: khóa chính của bảng, là định danh duy nhất cho mỗi bản ghi trong bảng. Nó đòi hỏi cột (hoặc các cột) tạo thành khóa chính phải thỏa mãn hai điều kiện: không NULL và mỗi giá trị phải duy nhất trong toàn bảng. Mỗi bảng chỉ cho phép tối đa một khóa chính và theo nguyên tắc thiết kế, mỗi bảng đều cần 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 PK_Bang PRIMARY KEY (Cot_1, Cot_2)
)
 
--Cách 3, thêm ràng buộc cho bảng đã có sẵn
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 tạo một unique index để thực thi tính duy nhất. Đây là cách làm tối ưu để kiểm tra xem một giá trị có duy nhất hay không. Mỗi khi có giá trị mới được thêm vào hay được cập nhật, hệ thống sẽ định vị trên cây index để tìm vị trí thích hợp cho nó. Nếu giá trị này đã xuất hiện, hệ thống sẽ văng ngược trở ra và báo lỗi. Ngược lại, giá trị mới được lưu vào cây index.
Index được tạo cùng với khóa chính một cách mặc định là clustered index. Bạn có thể chỉ định nó là non-clustered khi cần thiết, nhưng thông thường bạn nên để ở chế độ mặc định.
Bạn nên chọn trường có kích thước nhỏ làm khóa chính. Khi có nhiều trường kết hợp với nhau xác định định danh của bản ghi (ví dụ ba trường tên, ngày sinh và nguyên quán của bảng thí sinh), bạn có thể tạo thêm một trường THISINH_ID kiểu INTEGER làm đại diện và dùng nó làm khóa chính, và đưa ba trường kia vào một khóa duy nhất (xem phần dưới đây).

UNIQUE KEY CONSTRAINT: ràng buộc duy nhất, yêu cầu các giá trị trong cột phải khác nhau. Ràng buộc này cho phép cột hoặc các cột cấu thành khóa phải là NULL, tuy nhiên chỉ một giá trị NULL được phép xuất hiện (về khác biệt giữa định nghĩa khóa duy nhất của ANSI và SQL Server, mời bạn đọc thêm bài Tạo Ràng Buộc Duy Nhất Bằng Filtered Index). Bạn có thể tạo nhiều ràng buộc duy nhất trên cùng một bảng. Ràng buộc duy nhất cũng kéo theo một unique index giống như với khóa chính, và cơ chế kiểm tra tính duy nhất cũng giống như vậy. Điểm khác là unique index được tạo ở đây mặc định là non-clustered, trừ khi bạn chỉ định nó là clustered.
Bạn có thể thấy về mặt logic, ràng buộc duy nhất cộng thêm NOT NULL tương đương với khóa chính. Và ngoại trừ một vài khác biệt nhỏ, tạo một unique index trên cột cũng tương đương với tạo ràng buộc duy nhất trên cột đó.
Tạo ràng buộc duy nhất:

ALTER TABLE ThiSinh ADD CONSTRAINT UC_ThiSinh UNIQUE (Ten, NgaySinh, NguyenQuan)

FOREIGN KEY: ràng buộc khóa ngoại. Nó đòi hỏi cột chỉ được phép chứa giá trị xuất hiện trong cột khóa chính của bảng khác. Ràng buộc này đảm bảo tính toàn vẹn tham chiếu dữ liệu. Ví dụ với database bán hàng, bạn có bảng SanPham với SanPham_ID là khóa chính, và bảng BanHang có trường SanPham_ID với mục đích chứa ID của các sản phẩm có trong bảng SanPham. Khi đó, bạn cần tạo ràng buộc khóa ngoại trên trường Sanpham_ID của bảng BanHang, tham chiếu đến trường Sanpham_ID của bảng SanPham. Ràng buộc này đảm bảo:
- Không ai có thể đưa các giá trị SanPham_ID “tầm bậy” vào bảng BanHang. Các giá trị đều phải tồn tại trong bảng SanPham. Ví dụ, bảng SanPham chứa các ID từ 1 – 100; bạn không thể thêm một bản ghi vào bảng BanHang với SanPham_ID = 101. Nói cách khác, các hóa đơn bán hàng phải chứa các sản phẩm đã có trong danh mục.
- Nếu một SanPham_ID đã xuất hiện trong bảng BanHang (sản phẩm đã có giao dịch), không ai có thể xóa bản ghi của SanPham_ID đó trong bảng SanPham. Ví dụ, trong bảng SanPham có chứa sản phẩm Kindle Fire với ID = 52; sau khi có giao dịch bán hàng trên sản phẩm này, bảng BanHang sẽ xuất hiện bản ghi với SanPham_ID = 52; khi đó bạn không thể xóa bản ghi của Kindle Fire khỏi bảng SanPham, vì bản ghi kia trong bảng BanHang sẽ trở nên mồ côi (tham chiếu đến một sản phẩm ID không tồn tại).
Code:

ALTER TABLE dbo.BanHang ADD CONSTRAINT FK_SanPham_ID FOREIGN KEY (SanPham_ID) REFERENCES dbo.SanPham(SanPham_ID)

Một vài lưu ý với ràng buộc khóa ngoại:
- Tuy cột là khóa của bảng, nhưng các giá trị cho phép của nó lại được qui định từ một cột ở bảng khác. Vì thế có tên gọi khóa ngoại.
- Cột được tham chiếu phải là unique (primary key hoặc unique key).
- Bảng được tham chiếu phải nằm trong cùng database.

NOT NULL: ràng buộc này đơn giản là yêu cầu dữ liệu nhập vào cho cột phải chứa giá trị chứ không được để NULL. Khi bạn sửa lại một cột thành NOT NULL của bảng đã chứa dữ liệu (dùng ALTER TABLE), Toàn bộ các bản ghi của bảng đó sẽ được kiểm tra. Nếu hệ thống tìm thấy NULL nó sẽ báo lỗi và hủy bỏ lệnh ALTER TABLE. Lệnh sau sửa lại cột SanPham_ID thành NOT NULL:

ALTER TABLE dbo.BanHang ALTER TABLE SanPham_ID INT NOT NULL

DEFAULT: ràng buộc mặc định. Khi nhập dữ liệu cho bảng mà cột đó không được cung cấp giá trị thì giá trị mặc định sẽ được sử dụng. Ví dụ bạn có thể tạo ràng buộc DEFAULT cho trường NgayGD (ngày giao dịch) của bảng bán hàng là ngày giờ hệ thống:

ALTER TABLE dbo.BanHang ADD CONSTRAINT DF_NgayGD DEFAULT GETDATE() FOR NgayGD

CHECK: ràng buộc kiểm tra. Yêu cầu cột tương ứng phải thỏa mãn một biểu thức logic. Ví dụ, ràng buộc sau đòi hỏi cột SL (số lượng) phải lớn hơn 0:

ALTER TABLE dbo.BanHang ADD CONSTRAINT Chk_SL CHECK (SL>0)

Bạn có thể dùng hàm trong biểu thức của ràng buộc check, miễn là hàm phải thuộc loại trả về giá trị đơn (scalar function, không được dùng hàm kiểu bảng).

* Lưu ý
Bạn có thể thắc mắc, tất cả các ràng buộc trên đây đều có thể tự viết code để thực hiện. Ví dụ thay vì tạo ràng buộc duy nhất, trước khi insert bạn có thể thêm lệnh IF EXISTS để kiểm tra xem giá trị đã tồn tại hay chưa, và chỉ cho insert nếu không tồn tại. Vậy tại sao cần khai báo các ràng buộc? Lý do thứ nhất là tính đơn giản, bạn chỉ cần khai báo một lần mà không cần viết lại code. Thứ hai là đây là hàng rào cuối cùng và tin cậy để kiểm tra xem dữ liệu có hợp lệ hay không. Khi viết code bạn chỉ có thể đảm bảo cho ứng dụng của bạn, còn những ứng dụng khác cùng truy nhập vào database sẽ nằm ngoài tầm kiểm soát của bạn. Thậm chí cùng một ứng dụng khi được viết vào những thời điểm khác nhau, bạn cũng không thể nhớ hết mỗi cột tuân theo những ràng buộc nào. Trong khi những ràng buộc được khai báo trong database nằm ngay bên ngoài vỏ của dữ liệu, và thực thi các kiểm tra khi dữ liệu đi vào dù bằng đường nào. Lý do nữa là ràng buộc có thể giúp tối ưu hóa thực hiện câu lệnh. Ví dụ một cột có ràng buộc CHECK giá trị phải lớn hơn 0; khi gặp câu lệnh tìm trên cột đó với giá trị âm, hệ thống sẽ tức thì trả về 0 bản ghi thay vì phải tìm từng bản ghi trong bảng.




Tags: , , , , ,

46 Comments
Posted on 28/11/2011 | Categories: Thiết kế database

Các bài viết tương tự

Comments
  • Đỗ Đức Diện (01/02/2012 3:44 am)

    Ô anh ơi cho em hỏi chút được không. Em đi học thì ông thầy có kêu là làm thực tế thì không nên dùng FOREIGN KEY. Theo anh có nên dùng ko à? Thank anh.

    • thông trịnh (27/04/2017 11:22 pm)

      làm thực tế đặc biệt là web thì it người xài FOREIGN KEY. vì đặc thù web là phai load nhanh. còn FOREIGN KEY thì ảnh hưởng đến tốc độ thực thi câu query => load chậm. bạn cứ chịu khó hiểu ngầm FOREIGN KEY cho các bảng rồi code ràng buộc sau. đó chỉ là áp dụng cho các web thương mại trung bình nhỏ thôi nha. còn vs web có quy mô lớn như ngân hàng, hàng không thì vẫn nên dùng FOREIGN KEY cho chắc ăn :)

  • Vũ Huy Tâm (05/02/2012 9:23 am)

    Foreign key làm chậm tốc độ thực hiện các lệnh INSERT/UPDATE/DELETE (thường là vậy, có một vài ngoại lệ), vì thế bạn cần dùng cho hợp lý. Nó là cách duy nhất để khai báo toàn vẹn tham chiếu, không dùng nó thì không có toàn vẹn tham chiếu, mà không có toàn vẹn tham chiếu thì còn gọi gì là CSDL quan hệ nữa. Lời khuyên của thầy bạn nếu đúng như vậy là cực kỳ ngớ ngẩn, hy vọng bạn hiểu sai ý ông thầy.

    • Nguyễn Quốc Việt (28/02/2012 4:04 am)

      Vào thực tế chẳng hiểu sao mấy video dạy làm web cũng chẳng thấy dùng Foreign Key,phải chăng với những CSDL nhỏ họ bỏ qua luôn?

      • tung (18/05/2014 10:33 pm)

        Giờ người ta bỏ qua Foreign Key khá nhiều. Chắc để tăng tốc độ các câu lệnh

        • Trình (30/12/2015 11:31 am)

          Dùng diagram cũng là một loại Foreign key phải không vậy… thay vì viết code ra mak người ta sử dụng nó để tạo khóa ngoại…. 2 cái này có cùng ý nghĩa như nhau phải ko a>???

          • Red Devilic (03/01/2016 10:52 pm)

            Dùng Diagram thực chất cũng tạo ngầm Foreign Key Constraint thôi.

            Nói cách khác, thường bạn phải gõ câu lệnh tạo FK, còn Diagram là thao tác trên giao diện.

    • LỘC TRIỆU (18/09/2014 11:16 am)

      vào thực tế CSDL cỡ lớn thì cứ tầm vài nghìn đến hàng chục nghìn giá trị nếu mà dùng ràng buộc khi muốn tìm kiếm hay thay đổi thì sẽ phải tìm 2 trường gây chậm và có thể bị sập luôn nếu nó quá lớn. Tối kị của việc tạo csdl là lấy từ nhiều bảng. Thường người ta truy xuất 1 bảng thôi như thế vừa nhanh vừa dễ. Thầy mình dạy thế :)

      • Vũ Huy Tâm (23/09/2014 9:16 am)

        Có mỗi nghe thầy mà bạn đã phán kinh quá!

  • nac danh (09/02/2012 6:22 am)

    chào anh !
    em đang xây dựng 1 website bán hàng online. trong csld có 1 bảng là khuyến mãi như sau.

    create table khuyenmai
    (
    idkhuyenmai int primary key not null,
    makhuyenmai nvarchar(20) unique,
    tenkhuyenmai nvarchar (300) unique not null
    )

    sau đó em viết hàm thêm khuyến mãi như sau.

    create proc themkhuyenmai
    @makhuyenmai nvarchar(20),
    @tenkhuyenmai nvarchar (300)
    as
    insert into khuyenmai( makhuyenmai,tenkhuyenmai) values(@makhuyenmai,@tenkhuyenmai)
    select SCOPE_IDENTITY()

    go

    và khi chạy: exec themkhuyenmai ‘KMT’,'khuyến mãi tháng’ thì chương trình báo lỗi tạm dịch là. “idkhuyenmai không cho phép dể null “. Nhưng ở đây “idkhuyenmai ” đã dc sinh bởi “select SCOPE_IDENTITY()”. vậy cho em hỏi có phải nguyên nhân là do ràng buộc về “unique ” không.

    chân thành cảm ơn anh !

    • Vũ Huy Tâm (27/02/2012 10:16 am)

      Bạn cần khai báo cột idkhuyenmai là IDENTITY:

      CREATE TABLE khuyenmai
      (
      idkhuyenmai INT PRIMARY KEY not null IDENTITY,
      makhuyenmai NVARCHAR(20) UNIQUE,
      tenkhuyenmai NVARCHAR (300) UNIQUE not null
      )
      • HÙNG (10/03/2014 12:14 pm)

        ALTER TABLE Phieuxuat
        ALTER COLUMN MaPX INT NOT NULL identity(1,1)

        ANH ƠI BÀI CỦA E YÊU CẦU THIẾT LẬP RẰNG BUỘC MÃ PHIẾU XUẤT LÀ KIỂU DỮ LIỆU INT TỰ ĐỘNG TĂNG. EM VIẾT NHƯ Z TOÀN BÁO LỖI Ở IDENTITY. ANH XEM HỘ EM VỚI AH. :( ((

  • HOÀNG QUÂN (24/02/2012 11:19 pm)

    em có câu hỏi nay mong anh tâm giúp: (Ràng buộc: Giá trị nhập vào cho field NGAY phải trước ngày hiện hành;)

    • Vũ Huy Tâm (27/02/2012 1:54 pm)
      ALTER TABLE dbo.Tbl ADD CHECK NGAY<getdate()

      Đại loại như vậy. Tôi chưa test nên không biết có chạy không

      • anh ngọc (29/02/2012 5:55 am)

        Anh ơi cho em hỏi trong SQL thì Index được lưu trữ ở đâu ạ? Trả lời gấp cho em nha! Thanks mấy anh!

        • Quan (02/04/2012 9:44 am)

          Trong table đó bạn, chung cấp với Column

  • Kendo Hoang (08/06/2012 3:55 am)

    Anh Tâm cho em hỏi: Em muốn viết ràng buộc cho trường phonenumber (có thể có 10 hoặc 11 số) và email (theo đùng đinh dạng mail là abc@domain.com) thì viết thế nào ah.
    Thanks anh! :d

    • thienthancotuong (15/08/2013 10:28 am)

      em cũng đang thắc mắc vấn đề này mong anh Tâm giúp em cái

      • Red Devilic (16/08/2013 12:42 am)

        Check độ dài thì có thể dùng length, email thì phức tạp hơn.

        Nhưng theo mình, phần check input thế này các bạn nên để trên phần giao diện, validate trong code như C#, Java sẽ dễ hơn.

  • Junkee (07/10/2012 7:12 am)

    Đại ca ơi em copy về trang của mình học luôn nhé , trên bài viết có ghi nguồn rồi đại ca

  • DUNG (29/01/2013 11:13 am)

    MÌNH MUỐN TẠO CỘT CHECK LIKE/DISLIKE THÌ LÀM NTN???

  • Jungin (08/09/2013 6:10 am)

    ALTER TABLE DONDH ADD CONSTRAINT FK_MNCC FOREIGN KEY (MaNhaCc) REFERENCES DBO.NHACC(MaNhaCc)

    Cho mình hỏi chút mình thêm ràng buộc khóa ngoại như sau nhưng nó báo lỗi như bên dưới: (Mình cần gấp có j hồi âm sớm giúp mình nhé! Thanks bạn nhìu)

    Msg 547, Level 16, State 0, Line 14
    The ALTER TABLE statement conflicted with the FOREIGN KEY constraint “FK_MNCC”. The conflict occurred in database “QLBanHang”, table “dbo.NHACC”, column ‘MaNhaCc’.

    • Nguyễn Xuân Định (04/11/2013 12:53 pm)

      mình làm thường thì thấy bảng đã có dữ liệu r sẽ bị vậy

  • Vũ Huy Tâm (09/09/2013 3:50 pm)

    trong bảng DONDH, cột MaNhaCc chứa các giá trị không có trong MaNhaCc ở bảng NHACC. Bạn cần sửa dữ liệu trước khi có thể thiết lập khóa ngoại. Để tìm ra các giá trị vi phạm bạn dùng:

    SELECT *
    FROM DONDH 
    LEFT JOIN NHACC ON DONDH.MaNhaCc = NHACC.MaNhaCc
    WHERE NHACC.ID_Column IS NULL --thay ID_Column bằng cột khóa chính của bảng
  • Nguyễn Xuân Định (04/11/2013 12:52 pm)

    em có các bảng (chỉ liệt kê các cột cần cho yêu cầu): sinhvien(masv), khoahoc(makhoahoc), khoa(makhoa), chuongtrinh(machuongtrinh), lop(sothutu)

    yêu cầu: mã sv có định dạng: mã khóa học (makhoahoc) – mã chuơng trình(machuongtrinh) – mã khoa(makhoa) – số thứ tự (sothutu)

    VD: 00_CT1-CQ-13
    *sinh viên mới thêm vào không dc trùng số thứ tự với các sv khác của lớp đó

    vậy ta gacn thuộc tính cho cột masv thoả các yêu cầu trên như thế nào ?

    • Vũ Huy Tâm (04/11/2013 2:15 pm)

      Bạn có thể khai báo masv là computed column và compute theo công thức trên

  • Nguyễn Hoàng Nam (08/11/2013 4:03 am)

    Em muốn khai báo 2 khóa ngoại trong bảng Lớp nhưng khi viết như dưới đây thì nó báo lỗi, anh giúp em với:

    CREATE TABLE Lop
    (
    	ma INT IDENTITY CONSTRAINT PK_Lop PRIMARY KEY (ma),
    	makhoahoc INT CONSTRAINT FK_Lop FOREIGN KEY (makhoahoc) REFERENCES KhoaHoc (ma),
    	makhoa INT CONSTRAINT FK_Lop FOREIGN KEY (makhoa) REFERENCES Khoa (ma),
    	machuongtrinh INT CONSTRAINT FK_Lop FOREIGN KEY (machuongtrinh) REFERENCES ChuongTrinh (ma),
    	sothutu INT not null
    )

    Lỗi:
    Msg 8168, Level 16, State 0, Line 1
    Cannot create, drop, enable, or disable more than one constraint, column, or trigger named ‘FK_Lop’ in this context. Duplicate names are not allowed.
    Msg 8168, Level 16, State 0, Line 1
    Cannot create, drop, enable, or disable more than one constraint, column, or trigger named ‘FK_Lop’ in this context. Duplicate names are not allowed.

    • Vũ Huy Tâm (08/11/2013 10:25 am)

      bạn phải đặt tên khóa ngoại khác nhau, tên FK_Lop chỉ được dùng 1 lần. Đọc thông báo lỗi …”Duplicate names are not allowed”

  • xuandao (13/11/2013 10:49 pm)

    có 2 table sau:
    khachhang(makh, hoten, ngsinh, ngayDangKy)
    hoadon(sohd, NgayHD, Gia)
    Yêu cầu: tạo rang buộc là ngày mua hang(NgayHD) phải lớn hơn hoặc bang ngày khách hang đăng ký làm thành viên (NgayDangKy).
    Anh hướng dẫn dùm cách viết yêu cầu này. Cám ơn nhiều

    • Dương (14/11/2013 3:10 am)

      Khi tạo ràng buộc thì chỉ có thể tạo ở cùng trong một bảng.vậy nên không thể tạo ràng buộc như bài toán của bạn.

    • Sai (14/12/2013 11:20 pm)

      cách của mình: Tạo một bẳng khác bằng cách Join giữa hai bảng.
      Rồi đặt điều kiện và nhớ tạo khóa ngoài.

  • Minh (03/01/2014 1:58 am)

    chào bạn!

    Bạn giúp mình Constraint này nhé..

    yều cầu khi nhập cột ngaysinh cần kiểm tra : tuổi >=18 và <= 55

    Cảm ơn bạn!

  • Tiên (17/05/2014 11:14 pm)

    cho e hỏi để chuyển cái trường ThanhTien sang kiểu NotNull như thế nào ạ, e làm report mà cứ báo trường đó null nên báo lỗi
    ALTER FUNCTION [dbo].[FC_ThongKe_BanHang_ChiTiet]
    (
    – Add the parameters for the function here
    @MaLoaiSP int,
    @TuNgay datetime,
    @DenNgay datetime
    )
    RETURNS TABLE
    AS
    RETURN
    (
    Select TenSP, Sum(SoLuong) As SoLuong, Gia, (Gia * Sum(SoLuong)) As ThanhTien, NgayLap
    From SanPham d Inner Join (Select MaSP, a.MaHD, SoLuong, NgayLap From HoaDon a Inner Join ChiTietHD b On a.MaHD = b.MaHD
    Where NgayLap >= @TuNgay And NgayLap <= @DenNgay) c On d.MaSP = c.MaSP
    Where MaLoaiSP = @MaLoaiSP
    Group By NgayLap, TenSP, Gia
    )

  • Lan Phương (03/06/2014 4:37 am)

    Anh chỉ giúp e cái này với ạ
    khi cộng các trường trong 1 bảng mà có 1 trường chứa vài giá trị là NULL thì làm thế nào để cộng được ạ?
    Cảm ơn anh!

    • Red Devilic (03/06/2014 11:12 pm)

      Bạn sử dụng hàm ISNULL nhé

  • nguoihanoi (05/07/2014 1:27 am)

    Thực tế cho tui thấy 90% CSDL ở ta là hoàn toàn không có ràng buộc nào sất. Chỉ là ràng buộc miệng, nhớ đại khái trong đầu, chẳng hề có trong 1 văn bản kỹ thuật nào. Khi hỏi trong CSDL của mình trường nào ràng buộc với trường nào thì anh A nói 1 đường anh B nói 1 nẻo.

    Kết quả sau vài năm hoạt động CSDL toàn rác là rác.

    Để thiên hạ sử dụng ràng buộc, chắc bác chủ xị phải dọa : không sử dụng ràng buộc sẽ chết đói :)

  • Kinh nghiem (16/07/2014 3:26 am)

    Cho mình hỏi hai cái cascade và restrict khác nhau như nào vậy

    • Hương Nguyễn (18/12/2014 4:56 am)

      cho mình hỏi xíu : mình muốn đặt tên cho bảng kết quả khi kết 2 bảng lại với nhau thì dùng câu lệnh ntn?
      bạn nào biết giúp mình mới,mình đang cần gấp,cảm ơn nhiều

  • tấn dũng (21/12/2014 9:39 am)

    anh ơi, cho em hỏi
    giờ ví dụ em có 1 bảng sanpham

    create table sinhvien
    {
    masp varchar(10) primary key,
    tensp varchar(100),
    giamua float
    }

    giờ em muốn ràng buộc giamua>0 thì em phải dùng lệnh gì ạ

  • Võ Thái Đạt (22/01/2015 3:26 am)

    ALTER TABLE sinhvien ADD CONSTRAINT Chk_giamua CHECK (giamua>0)

  • đức hiếu (30/09/2015 12:28 pm)

    a ơi cho e hỏi bây giờ e muốn liệt kê tất cả các nhân viên nam có lương trên 5tr va nhân viên nữ lương dưới 5 tr thì làm thế nào ạ? thanks

    • Thành (07/02/2016 10:34 pm)

      Bạn làm thế này nhé :

      WHERE
      (
      GIOITINH = NAM
      AND LUONG > 5000000
      )
      OR
      ( GIOITINH = NU
      AND LUONG < 5000000
      )

      Chúc bạn đức hiếu thành công nhé.

  • TUAN (22/02/2016 6:26 am)

    Ở đoạn: “NOT NULL: ràng buộc này đơn giản là yêu cầu dữ liệu nhập vào cho cột phải chứa giá trị chứ không được để NULL. Khi bạn sửa lại một cột thành NOT NULL của bảng đã chứa dữ liệu (dùng ALTER TABLE), Toàn bộ các bản ghi của bảng đó sẽ được kiểm tra. Nếu hệ thống tìm thấy NULL nó sẽ báo lỗi và hủy bỏ lệnh ALTER TABLE. Lệnh sau sửa lại cột SanPham_ID thành NOT NULL:

    ALTER TABLE dbo.BanHang ALTER TABLE SanPham_ID INT NOT NULL”

    hình như dòng lệnh phải là: “ALTER TABLE dbo.BanHang ALTER COLUMN SanPham_ID INT NOT NULL” mới đúng?

    • Luân (22/02/2016 10:06 am)

      Anh Tâm ghi nhầm .

  • phú (28/09/2016 12:45 am)

    Cho em hỏi trong một DTB một cặp khóa chính có thể xem là hai khóa ngoại được không ạ ?

  • Nhung (17/06/2017 5:15 am)

    Anh ơi, cho em hỏi em có tạo khóa ngoại cho bản HoaDon nhưng giờ em muốn xóa khóa ngoại đó phải làm sao anh, em after rồi xóa mà bị lỗi
    ” Incorrect syntax near ‘MaHD’ ” , đoạn SQL của em như thế này :

    CREATE TABLE HoaDon_Audit
     (
      MaHD INT ,
      TGVao DATE ,
      TGRa DATE,
      MaBan INT ,
      ChuThich INT ,
      ThaoTac NVARCHAR(100),
      ThoiGianTT DATETIME 
      FOREIGN KEY (MaBan) REFERENCES dbo.Ban(MaBan)
     
     )
     GO

Leave a Reply

Hướng dẫn: Để nhập mã T-SQL bạn dùng thẻ <pre lang="tsql"> và </pre>.
Ví dụ: <pre lang="tsql">SELECT * FROM MyTable</pre>