2012/06/12

Ràng buộc FOREIGN KEY trong SQL Server

Các bảng trong một cơ sở dữ liệu có mối quan hệ với nhau. Những mối quan hệ này biểu diễn cho sự quan hệ giữa các đối tượng trong thế giới thực. Về mặt dữ liệu, những mối quan hệ được đảm bảo thông qua việc đòi hỏi sự có mặt của một giá trị dữ liệu trong bảng này phải phụ thuộc vào sự tồn tại của giá trị dữ liệu đó ở trong một bảng khác.


Ràng buộc FOREIGN KEY được sử dụng trong định nghĩa bảng dữ liệu nhằm tạo nên mối quan hệ giữa các bảng trong một cơ sở dữ liệu. Một hay một tập các cột trong một bảng được gọi là khoá ngoại, tức là có ràng buộc FOREIGN KEY, nếu giá trị của nó được xác định từ khoá chính (PRIMARY KEY) hoặc khoá phụ (UNIQUE) của một bảng dữ liệu khác.

Ràng buộc FOREIGN KEY được định nghĩa theo cú pháp dưới đây:


[CONSTRAINT tên_ràng_buộc]
FOREIGN KEY [(danh_sách_cột)]
REFERENCES tên_bảng_tham_chiếu(danh_sách_cột_tham_chiếu)
[ON DELETE CASCADE | NO ACTION | SET NULL | SET DEFAULT]
[ON UPDATE CASCADE | NO ACTION | SET NULL | SET DEFAULT]

Việc định nghĩa một ràng buộc FOREIGN KEY bao gồm các yếu tố sau:

• Tên cột hoặc danh sách cột của bảng được định nghĩa tham gia vào khoá ngoài.
• Tên của bảng được tham chiếu bởi khoá ngoài và danh sách các cột được tham chiếu đến trong bảng tham chiếu.
• Cách thức xử lý đối với các bản ghi trong bảng được định nghĩa trong trường hợp các bản ghi được tham chiếu trong bảng tham chiếu bị xoá (ON DELETE) hay cập nhật (ON UPDATE). SQL chuẩn đưa ra 4 cách xử lý:
  • CASCADE: Tự động xoá (cập nhật) nếu bản ghi được tham chiếu bị xoá (cập nhật).
  • NO ACTION: (Mặc định) Nếu bản ghi trong bảng tham chiếu đang được tham chiếu bởi một bản ghi bất kỳ trong bảng được định nghĩa thì bàn ghi đó không được phép xoá hoặc cập nhật (đối với cột được tham chiếu).
  • SET NULL: Cập nhật lại khoá ngoài của bản ghi thành giá trị NULL (nếu cột cho phép nhận giá trị NULL).


  • SET DEFAULT: Cập nhật lại khoá ngoài của bản ghi nhận giá trị mặc định (nếu cột có qui định giá trị mặc định).




  • Ví dụ: Câu lệnh dưới đây định nghĩa bảng DIEMTHI với hai khoá ngoài trên cột MASV và cột MAMONHOC (giả sử hai bảng SINHVIEN và MONHOC đã được định nghĩa)
    CREATE TABLE diemthi
    (
    mamonhoc NVARCHAR(10) NOT NULL ,
    masv NVARCHAR(10) NOT NULL ,
    diemlan1 NUMERIC(4, 2),
    diemlan2 NUMERIC(4, 2),
    CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv),
    CONSTRAINT fk_diemthi_mamonhoc
    FOREIGN KEY(mamonhoc)
    REFERENCES monhoc(mamonhoc)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
    CONSTRAINT fk_diemthi_masv
    FOREIGN KEY(masv)
    REFERENCES sinhvien(masv)
    ON DELETE CASCADE
    ON UPDATE CASCADE
    )

    Lưu ý:
    • Cột được tham chiếu trong bảng tham chiếu phải là khoá chính (hoặc là khoá phụ).
    • Cột được tham chiếu phải có cùng kiểu dữ liệu và độ dài với cột tương ứng trong khóa ngoài.
    • Bảng tham chiếu phải được định nghĩa trước. Do đó, nếu các bảng có mối quan hệ vòng, ta có thể không thể định nghĩa ràng buộc FOREIGN KEY ngay trong câu lệnh CREATE TABLE mà phải định nghĩa thông qua lệnh ALTER TABLE.

    3 comments:

    1. create table zthanhvien
      (
      maso char(10) not null primary key,
      hoten nvarchar(20) not null,
      donvicongtac nvarchar(30),
      quocgia nvarchar(20),
      diachiemail nvarchar (30) not null,
      ban nvarchar(20),
      maban char(20),
      )

      create table ztaikhoan
      (
      tentaikhoan varchar(20) not null primary key,
      matkhau varchar(20) not null,
      mathanhvien char(10) not null
      )

      create table ztacgia
      (
      maso char(10) not null primary key,
      donvicongtac01 nvarchar(30),
      donvicongtac02 nvarchar(30),
      )

      create table ztomtatbaocao
      (
      mabaocao int not null identity(1,1) primary key,
      tenbaocao nvarchar(50) not null,
      noidungbaocao nvarchar(3000),
      matacgiachinh char(10),
      matacgiaphu01 char(10),
      matacgiaphu02 char(10)
      )

      alter table ztacgia add foreign key(maso) references zthanhvien(maso) on delete cascade on update cascade
      alter table ztaikhoan add foreign key(mathanhvien) references zthanhvien(maso) on delete cascade on update cascade
      alter table ztomtatbaocao add foreign key(matacgiachinh) references ztacgia(maso) on delete cascade on update cascade
      alter table ztomtatbaocao add foreign key(matacgiaphu01) references ztacgia(maso) on delete cascade on update cascade
      alter table ztomtatbaocao add foreign key(matacgiaphu02) references ztacgia(maso) on delete cascade on update cascade

      Msg 1785, Level 16, State 0, Line 378
      Introducing FOREIGN KEY constraint 'FK__ztomtatba__matac__55009F39' on table 'ztomtatbaocao' may cause cycles
      or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
      Msg 1750, Level 16, State 0, Line 378
      Could not create constraint or index. See previous errors.


      bị báo lỗi ở 2 dòng cuối bạn có thể giúm mình không?

      ReplyDelete