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

Tạo mối quan hệ trong SQL Server 2017

Tìm hiểu cách tạo mối quan hệ giữa hai bảng trong SQL Server.

Trong thiết kế cơ sở dữ liệu quan hệ, một quan hệ là nơi hai hoặc nhiều bảng được liên kết với nhau vì chúng chứa dữ liệu liên quan. Điều này cho phép người dùng chạy các truy vấn cho dữ liệu liên quan trên nhiều bảng.

Phần này của hướng dẫn giải thích cách tạo các mối quan hệ sau:

Có hai mối quan hệ trong sơ đồ đó. Có mối quan hệ giữa AlbumsArtists và có một mối quan hệ khác giữa AlbumsGenres bảng.

Bằng cách nhìn vào sơ đồ đó, chúng ta có thể thấy rằng một nghệ sĩ có thể có nhiều album. Trong trường hợp này, chúng ta chỉ cần có một hàng chứa tên nghệ sĩ, bất kể họ có bao nhiêu album. Điều này là do chúng tôi có thể tạo bản ghi trong Artists bảng có ArtistId duy nhất . Tất cả các album của nghệ sĩ đó sẽ nằm trong Albums và chúng sẽ chứa cùng một ID nghệ sĩ trong ArtistId của chính nó cột. Bằng cách này, chúng tôi có thể chạy một truy vấn trên cả hai bảng và trả về tên của nghệ sĩ, cộng với tất cả các album mà họ đã phát hành. Đây là lợi ích của các mối quan hệ.

Trước đây chúng ta đã tạo một cơ sở dữ liệu chứa ba bảng trên. Khi chúng tôi làm điều đó, chúng tôi cũng tạo ra một trong những mối quan hệ được mô tả trong sơ đồ trên. Chúng tôi đã tạo mối quan hệ giữa Albums bảng và Artists bảng (trong đó ArtistId của Albums bảng tham chiếu đến ArtistsId cột của Artists bảng).

Đây là mã chúng tôi đã chạy để tạo bảng:

Mã được đánh dấu là phần tạo ra mối quan hệ giữa Albums bảng và Artists bàn. Nó thực hiện điều này bằng cách đặt ArtistId của Albums để tham chiếu ArtistId cột của Artists bảng.

Một cách nói kỹ thuật hơn là Albums.ArtistId trở thành khóa ngoại của Artists.ArtistId (chính nó là khóa chính của bảng đó). Đây là một ràng buộc khóa ngoại.

Ràng buộc khóa ngoại là gì?

Một ràng buộc khóa ngoại xác định mối quan hệ giữa bảng này và bảng khác. Khi bạn tạo ràng buộc khóa ngoại, bạn tạo nó dựa trên một cột cụ thể trong con bảng, để tham chiếu một cột cụ thể trong cha bảng.

Điều này làm cho cột đó trong bảng con trở thành khóa ngoại . Ràng buộc đảm bảo rằng bất kỳ giá trị nào đi vào cột (khóa ngoại) này tương ứng với một giá trị trong cột khóa chính của bảng mẹ. Nếu ai đó cố gắng nhập một giá trị không tương ứng với một giá trị trong cột khóa chính của bảng mẹ, SQL Server sẽ báo lỗi.

Điều này giúp thực thi tính toàn vẹn của tham chiếu. Nó ngăn chúng ta có các bản ghi mồ côi (các bản ghi con không có cha mẹ). Hoặc trong ví dụ của chúng tôi, các album không được liên kết với bất kỳ nghệ sĩ nào.

Nếu bạn sử dụng công cụ quản lý cơ sở dữ liệu GUI như SSMS hoặc Azure Data Studio, mối quan hệ sẽ xuất hiện trong Keys nút cho bảng có khóa ngoại:

Hãy giải mã:

CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId)     
    REFERENCES dbo.Artists (ArtistId)     
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION

Hai dòng đầu tiên tạo ra mối quan hệ. Chúng tạo ra một ràng buộc khóa ngoại giữa Albums.ArtistId và cột Artists.ArtistId cột. Trong trường hợp này, chúng tôi gọi ràng buộc khóa ngoại là FK_Albums_Artists .

Hai dòng cuối cùng chỉ định những gì SQL Server sẽ làm nếu ai đó cố gắng xóa hoặc cập nhật bản ghi mẹ đang được tham chiếu bởi bản ghi trong bảng con. Trong trường hợp này, NO ACTION có nghĩa là xóa / cập nhật sẽ không tiếp tục. Người dùng sẽ chỉ gặp lỗi.

Bạn có thể thay đổi cài đặt này thành ON DELETE CASCADE nếu bạn muốn có thể xóa cha và con trong một lần (tức là quá trình xóa sẽ phân tầng từ cha sang con). Logic tương tự cũng áp dụng cho các bản cập nhật, bằng cách sử dụng ON UPDATE CASADE .

NO ACTION là giá trị mặc định, vì vậy chúng tôi có thể đã thực hiện mà không có hai dòng mã cuối cùng đó. Tuy nhiên, tôi đã bao gồm nó, vì đó là một yếu tố quan trọng cần nghĩ đến khi tạo các ràng buộc khóa ngoại.

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

Ví dụ trước tạo mối quan hệ cùng lúc các bảng được tạo. Tuy nhiên, đôi khi bạn cần thêm một mối quan hệ vào một bảng hiện có.

Hãy thêm một mối quan hệ mới giữa GenresAlbums bảng.

Chạy mã sau:

USE Music;   
ALTER TABLE Albums
ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId)     
	REFERENCES dbo.Genres (GenreId)     
	ON DELETE NO ACTION    
	ON UPDATE NO ACTION
;

Thao tác này tạo một khóa ngoại mới trên Albums bàn. Kết quả là Albums.GenreId trở thành một khóa ngoại tham chiếu đến Genres.GenreId .

Vì vậy, việc chạy câu lệnh đó dẫn đến một khóa ngoại mới được hiển thị trong Keys nút:

Khóa ngoài một cột

Các khóa ngoại một cột (như khóa ở trên) cũng có thể được chỉ định ở cấp cột. Vì vậy, một cách khác để tạo Albums bảng và khóa ngoại của nó giống như sau:

CREATE TABLE Albums (
  AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  AlbumName nvarchar(255) NOT NULL,
  ReleaseDate date NOT NULL,
  ArtistId int NOT NULL
		REFERENCES Artists(ArtistId),
  GenreId int NOT NULL   
);

Phương thức này không thể được sử dụng trên các ràng buộc khóa nhiều cột, vì vậy đối với những ràng buộc đó, hãy sử dụng cú pháp trong ví dụ ban đầu ở trên.

Khóa ngoài nhiều cột

Khóa ngoại nhiều cột là nơi có nhiều hơn một cột được sử dụng cho khóa ngoại. Điều này thường được sử dụng khi bảng mẹ sử dụng nhiều cột cho khóa chính của nó. Trường hợp này có thể xảy ra nếu bảng mẹ kết hợp các giá trị từ hai cột để tạo ra một giá trị duy nhất.

Khóa ngoại nhiều cột có thể được tạo bằng cú pháp trong ví dụ ban đầu ở trên. Chỉ cần thêm từng tên cột được phân tách bằng dấu phẩy.

Vì vậy, nếu chúng ta tưởng tượng rằng Albums bảng cũng có ArtistName cột (và Artists bảng sử dụng ArtistIdArtistName làm khóa chính của nó), một khóa ngoại nhiều cột sẽ trông giống như sau:

CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName)     
    REFERENCES dbo.Artists (ArtistId, ArtistName)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bộ đệm ẩn đối tượng tạm thời của SQL Server

  2. Thành thạo việc sử dụng danh sách dừng với tìm kiếm toàn văn bản trên SQL Server (FTS)

  3. Lỗi máy chủ SQL 4104:Không thể liên kết số nhận dạng nhiều phần.

  4. Có sự khác biệt nào giữa DECIMAL và NUMERIC trong SQL Server không?

  5. Tập lệnh khoảng không quảng cáo thu thập SQL Server -1