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

Tạo khóa ngoại trong SQLite

Khi bạn tạo một bảng trong SQLite, bạn cũng có thể tạo một khóa ngoại để thiết lập mối quan hệ với một bảng khác.

Bài viết này cung cấp một ví dụ về cách tạo khóa ngoại khi tạo bảng trong SQLite.

Bật hỗ trợ khóa nước ngoài

Điều đầu tiên chúng ta nên làm là bật hỗ trợ khóa ngoài (nếu nó chưa được thực hiện).

Giả sử thư viện SQLite của bạn chưa được biên dịch bằng SQLITE_OMIT_FOREIGN_KEY hoặc SQLITE_OMIT_TRIGGER đã xác định, bạn vẫn cần bật hỗ trợ khóa ngoại trong thời gian chạy.

Để thực hiện việc này, hãy chạy câu lệnh sau:

PRAGMA foreign_keys = ON;

Điều này sẽ cho phép thực thi khóa ngoại cho kết nối cơ sở dữ liệu của bạn.

Nếu bạn mở một kết nối khác, bạn sẽ cần chạy cùng một câu lệnh cho kết nối đó.

Lưu ý rằng cài đặt này không bắt buộc để tạo khóa ngoại, nhưng nó được yêu cầu để thực thi khóa ngoại.

Bây giờ chúng tôi đã bật hỗ trợ khóa ngoài, hãy tiếp tục và tạo khóa ngoài.

Ví dụ

Hãy tưởng tượng chúng ta muốn có hai bảng với dữ liệu sau.

Bảng có tên Thú cưng :

PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         

Bảng được gọi là Loại s:

TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Và chúng tôi muốn TypeId cột Thú cưng để tham chiếu đến TypeId cột Loại bàn.

Nói cách khác, chúng tôi muốn tạo Pets.TypeId khóa con (có ràng buộc khóa ngoại) và Loại.TypeId khóa cha (với ràng buộc khóa chính).

Mặc dù khóa cha thường cũng là khóa chính cho bảng, nhưng đây thực sự không phải là một yêu cầu. Trong ví dụ này, chúng tôi sẽ đặt nó làm khóa chính.

Chúng ta có thể sử dụng đoạn mã sau để tạo hai bảng này.

CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId,
    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);

Phần tạo khóa ngoại là:

FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

FOREIGN KEY(TypeId) phần khai báo Pets.TypeId làm khóa ngoại.

Mặc dù tôi không đủ điều kiện đặt tên cột với tên bảng của nó, nhưng chúng tôi biết đó là Pets.TypeId (chứ không phải Loại.TypeId ) vì chúng tôi đang chạy cái này trong CREATE TABLE tuyên bố cho Thú cưng .

REFERENCES Types(TypeId) chỉ định cột mà khóa ngoại của chúng tôi sẽ tham chiếu. Trong trường hợp này, nó sẽ tham chiếu đến TypeId cột Loại bảng.

Bây giờ các bảng của chúng tôi đã được tạo bằng khóa ngoại thích hợp, chúng tôi có thể thêm dữ liệu.

INSERT INTO Types VALUES 
    ( NULL, 'Dog' ),
    ( NULL, 'Cat' ),
    ( NULL, 'Parakeet' ),
    ( NULL, 'Hamster' );

INSERT INTO Pets VALUES 
    ( NULL, 'Brush', 3 ),
    ( NULL, 'Tweet', 3 ),
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Woofer', 1 ),
    ( NULL, 'Fluff', 2 );

Các bảng hiện chứa dữ liệu được hiển thị ở trên.

sqlite> SELECT * FROM Pets;
PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         
sqlite> SELECT * FROM Types;
TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Vi phạm khóa ngoại

Nhưng bây giờ hãy thử chèn dữ liệu vi phạm khóa ngoại.

Hãy thử thêm một con vật cưng sử dụng TypeID không tồn tại (tức là một TypeId giá trị không tồn tại trong Loại cột).

INSERT INTO Pets VALUES 
    ( NULL, 'Homer', 5 );

Kết quả:

Error: FOREIGN KEY constraint failed

Vì vậy, khóa ngoại của chúng tôi đã ngăn chặn thành công dữ liệu xấu xâm nhập vào cơ sở dữ liệu. Do đó, nó đã giúp chúng tôi duy trì tính toàn vẹn của dữ liệu.

Nếu bạn không gặp lỗi này và dữ liệu đã được chèn thành công, bạn chưa bật hỗ trợ khóa ngoại. Như đã đề cập, bạn cần bật hỗ trợ khóa ngoại trước khi khóa ngoại của bạn được thực thi.

Thêm khóa ngoại vào bảng hiện có

ALTER TABLE câu lệnh trong SQLite rất hạn chế và nó không cho phép thêm khóa ngoại vào bảng hiện có.

Do đó, nếu bạn cần thêm khóa ngoại vào bảng hiện có, bạn sẽ cần xóa bảng và tạo lại bằng ràng buộc khóa ngoại.

Nếu bảng chứa dữ liệu mà bạn muốn giữ lại, bạn có thể chuyển dữ liệu đó sang một bảng khác, trước khi chuyển dữ liệu đó trở lại sau khi bạn đã tạo bảng mới với ràng buộc khóa ngoại.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android - Cách tiếp cận tốt hơn trong việc tải hình ảnh thẻ SD CARD

  2. Làm thế nào để lưu trữ và truy xuất một mảng byte (dữ liệu hình ảnh) đến và từ cơ sở dữ liệu SQLite?

  3. Hiển thị tiến trình trong khi doInbackground

  4. Định dạng kết quả SQLite dưới dạng JSON

  5. Cố gắng mở lại sqlitedatabase đối tượng đã bị đóng