SQLite hỗ trợ các mối quan hệ giống như bất kỳ hệ thống quản lý cơ sở dữ liệu quan hệ nào khác.
SQLite là một quan hệ hệ quản trị cơ sở dữ liệu (RDBMS). Nó sử dụng cùng một mô hình quan hệ mà các DBMS phổ biến khác (chẳng hạn như MySQL, Oracle, SQL Server, MS Access) sử dụng.
Điều này có nghĩa là bạn có thể tạo nhiều bảng, sau đó để chúng liên kết với nhau thông qua mối quan hệ .
Một mối quan hệ là nơi bạn có nhiều bảng chứa dữ liệu liên quan và dữ liệu được liên kết bằng một giá trị chung được lưu trữ trong cả hai bảng.
Sơ đồ sau minh họa khái niệm này:
Vì vậy, hãy thêm một bảng khác có tên là Album , sau đó liên kết với Nghệ sĩ của chúng tôi bảng thông qua một mối quan hệ.
Làm điều này sẽ cho phép chúng tôi tra cứu một album nhất định thuộc về nghệ sĩ nào.
Tạo bảng mới
Vì vậy, hãy tiếp tục và tạo Album bảng:
CREATE TABLE Albums( AlbumId INTEGER PRIMARY KEY, AlbumName TEXT NOT NULL, Year TEXT NOT NULL, ArtistId INTEGER NOT NULL, FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) );
Tương tự như khi chúng tôi tạo
Nghệ sĩ
tuy nhiên, trên bảng này, chúng tôi đã thêm FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
vào cuối câu lệnh.
Điều này tạo ra một ràng buộc khóa ngoại trên Albums.ArtistId cột. Điều này có nghĩa là, bất kỳ dữ liệu nào được chèn vào cột này, phải khớp với một giá trị trong Artists.ArtistId cột.
Nếu chúng tôi không làm điều này, sẽ có thể có một album không thuộc về một nghệ sĩ. Nói cách khác, chúng tôi có thể có các bản ghi mồ côi trong cơ sở dữ liệu của mình. Sẽ không tốt nếu bạn đang cố gắng duy trì tính toàn vẹn của tham chiếu.
Bây giờ, nếu chúng ta chạy .tables
, chúng ta sẽ thấy cả hai bảng trong cơ sở dữ liệu:
sqlite> .tables Albums Artists
Kiểm tra mối quan hệ
Khi chúng tôi đã tạo bảng bằng khóa ngoại, chúng tôi có thể kiểm tra nó bằng cách cố gắng nhập dữ liệu sai. Chúng tôi có thể thử nhập một album có ArtistId không khớp với ArtistId trong bảng được tham chiếu (tức là Nghệ sĩ bảng):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
Điều này sẽ dẫn đến những điều sau:
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
Ngoài ra, đang chạy SELECT
câu lệnh trên bảng sẽ không trả về dữ liệu.
Điều này là do ràng buộc khóa ngoại đã chặn chèn sai giá trị.
Không hoạt động?
Nếu bạn không gặp lỗi khi cố gắng nhập dữ liệu sai như thế này, bạn có thể cần phải kiểm tra cài đặt của mình.
Chạy lệnh sau:PRAGMA foreign_keys;
Nếu điều này dẫn đến 0
nó có nghĩa là các ràng buộc khóa ngoại của bạn bị vô hiệu hóa. Trên thực tế, đây là hành vi mặc định của SQLite (nó để tương thích ngược).
Để bật các ràng buộc khóa ngoại, hãy nhập PRAGMA foreign_keys = ON;
sau
Bây giờ, đang chạy PRAGMA foreign_keys;
nên trả về 1
và các nỗ lực tiếp theo để chèn khóa ngoại không hợp lệ sẽ không thành công.
Tuy nhiên, nếu PRAGMA foreign_keys;
lệnh không trả về dữ liệu, việc triển khai SQLite của bạn không hỗ trợ khóa ngoại (vì nó cũ hơn phiên bản 3.6.19 hoặc vì nó được biên dịch bằng SQLITE_OMIT_FOREIGN_KEY
hoặc SQLITE_OMIT_TRIGGER
định nghĩa).
Chèn thêm dữ liệu
Bây giờ mối quan hệ đã được thiết lập, chúng tôi có thể thêm bao nhiêu dữ liệu chúng tôi cần, với sự tự tin rằng chỉ những bản ghi có khóa ngoại hợp lệ mới được chèn.
INSERT INTO Albums VALUES (NULL, 'Killers', '1981', 7); INSERT INTO Albums VALUES (NULL, 'Powerslave', '1984', 7); INSERT INTO Albums VALUES (NULL, 'Surfing with the Alien', '1987', 1); INSERT INTO Albums VALUES (NULL, 'Heavy as a Really Heavy Thing', '1995', 11); INSERT INTO Albums VALUES (NULL, 'Yummy Yummy', '1994', 17); INSERT INTO Albums VALUES (NULL, 'Out of the Loop', '2007', 6); INSERT INTO Albums VALUES (NULL, 'Suck on This', '1989', 13); INSERT INTO Albums VALUES (NULL, 'Pork Soda', '1993', 13); INSERT INTO Albums VALUES (NULL, 'Sailing the Seas of Cheese', '1991', 13); INSERT INTO Albums VALUES (NULL, 'Flying in a Blue Dream', '1989', 1); INSERT INTO Albums VALUES (NULL, 'Black Swans and Wormhole Wizards', '2010', 1); INSERT INTO Albums VALUES (NULL, 'Somewhere in Time', '1986', 7); INSERT INTO Albums VALUES (NULL, 'Big Red Car', '1995', 17);
Tiếp theo, chúng tôi sẽ chọn dữ liệu từ cả hai bảng bằng cách sử dụng JOIN
tuyên bố.