Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Tạo mối quan hệ trong SQL

Trong SQL, bạn tạo mối quan hệ bằng cách tạo ràng buộc khóa ngoại.

Cụ thể hơn, bạn có một bảng cha và một bảng con. Bảng mẹ chứa khóa chính và bảng con chứa khóa ngoại tham chiếu đến khóa chính của bảng mẹ.

Khi bạn sử dụng SQL để tạo mối quan hệ, bạn có thể tạo mối quan hệ tại thời điểm tạo bảng hoặc bạn có thể tạo sau (bằng cách thay đổi bảng). Bài viết này đề cập đến cả hai trường hợp.

Tạo mối quan hệ khi tạo bảng

Đây là ví dụ về cách tạo mối quan hệ trong CREATE TABLE của bạn tại thời điểm bạn tạo bảng.

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
  CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
);

Ở đây tôi đã tạo hai bảng; một được gọi là Parent và cái còn lại được gọi là Child .

Tôi đã tạo mối quan hệ trong định nghĩa bảng cho con. Mối quan hệ được tạo bằng CONSTRAINT lý lẽ. Lưu ý rằng nó vẫn nằm trong CREATE TABLE tuyên bố.

Mối quan hệ cần một cái tên. Trong trường hợp này, tôi gọi nó là FK_Child_Parent . FOREIGN KEY theo sau là tên của cột (trong bảng con) sẽ là khóa ngoại.

REFERENCES phần chỉ định cột mà khóa ngoại sẽ tham chiếu. Trong trường hợp này, nó tham chiếu đến ParentId cột của Parent bàn. Điều này được thực hiện bằng cách sử dụng REFERENCES Parent (ParentId) .

Đó là tất cả những gì cần thiết để tạo ra mối quan hệ.

Lưu ý rằng các ví dụ trên trang này được thực hiện bằng SQL Server. Tùy thuộc vào DBMS của bạn, bạn có thể cần thay đổi một số chi tiết của định nghĩa cột.

Ví dụ:IDENTITY là phiên bản của SQL Server đôi khi được gọi là AUTO_INCREMENT trong các DBMS khác (chẳng hạn như MySQL). Nếu bạn sử dụng SQLite, thì đây là cách tạo cột tự động tăng dần trong SQLite.

Thêm mối quan hệ vào bảng hiện có

Bạn cũng có thể thêm một mối quan hệ vào một bảng hiện có, đơn giản bằng cách sử dụng ALTER TABLE tuyên bố.

Giả sử rằng chúng ta không tạo mối quan hệ khi tạo hai bảng từ ví dụ trước. Vì vậy, hãy giả vờ rằng chúng tôi đã làm điều này thay thế:

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
);

Vì vậy, trong kịch bản này, tất cả những gì chúng tôi làm là tạo hai bảng. Không có mối quan hệ nào được tạo ra giữa họ.

Bây giờ, sau khi tạo các bảng, chúng tôi chợt nhớ “ồ, tôi đã quên tạo mối quan hệ!”.

Không sao, bây giờ chúng ta có thể thực hiện việc này:

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId);

Xong. Chúng tôi vừa thêm mối quan hệ bằng cách sử dụng các chi tiết tương tự như trong ví dụ trước.

Lưu ý rằng SQLite không hỗ trợ thêm khóa ngoại với ALTER TABLE tuyên bố. Xem cách thêm khóa ngoại vào bảng hiện có trong SQLite để biết thêm về điều đó.

Khi cập nhật / xóa

Theo mặc định, các mối quan hệ SQL Server được tạo bằng cách sử dụng ON DELETE NO ACTIONON UPDATE NO ACTION . Do đó, các ví dụ trước đã được tạo bằng cách sử dụng cài đặt này.

Tuy nhiên, các DBMS khác nhau có thể sử dụng các cài đặt mặc định khác.

Dù bằng cách nào, bạn có thể chỉ định rõ ràng điều này trong mã của mình. Vì vậy, chúng ta có thể sửa đổi ví dụ trước để trông giống như sau:

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION;

Điều này thực sự có nghĩa là, nếu ai đó cố gắng xóa hoặc cập nhật một bản ghi trong khóa chính, một lỗi sẽ xảy ra và thay đổi sẽ được khôi phục lại. Đây là cách của SQL Server để ngăn chặn bất kỳ thay đổi nào có thể phá vỡ tính toàn vẹn tham chiếu của hệ thống của bạn.

Về cơ bản, lý do bạn tạo mối quan hệ ngay từ đầu là để thực thi tính toàn vẹn của tham chiếu.

Tuy nhiên, bạn có một số tùy chọn về cách bạn muốn SQL Server đối phó với những tình huống này.

Cụ thể, bạn có thể sử dụng bất kỳ giá trị nào sau đây:

  • NO ACTION :Đã xảy ra lỗi và hành động xóa / cập nhật trên hàng trong bảng chính được khôi phục.
  • CASCADE :Các hàng tương ứng sẽ bị xóa / cập nhật trong bảng tham chiếu nếu hàng đó bị xóa khỏi / cập nhật trong bảng mẹ.
  • SET NULL :Tất cả các giá trị tạo nên khóa ngoại được đặt thành NULL nếu hàng tương ứng trong bảng mẹ bị xóa hoặc cập nhật. Điều này yêu cầu các cột khóa ngoại là không thể bỏ qua.
  • SET DEFAULT :Tất cả các giá trị tạo nên khóa ngoại được đặt thành giá trị mặc định của chúng nếu hàng tương ứng trong bảng mẹ bị xóa hoặc cập nhật. Để ràng buộc này thực thi, tất cả các cột khóa ngoại phải có định nghĩa mặc định. Nếu một cột có giá trị là nullable và không có bộ giá trị mặc định rõ ràng, NULL trở thành giá trị mặc định ngầm định của cột.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lược đồ bông tuyết

  2. Cách đánh số hàng trong SQL

  3. Vấn đề Halloween - Phần 3

  4. Cải thiện hỗ trợ cho việc xây dựng lại số liệu thống kê song song

  5. SQL CHỌN AVG