Khóa ngoại có cần ràng buộc không?

Khóa ngoại là sự liên kết logic của các hàng giữa hai bảng, trong mối quan hệ cha-con. Một hàng trong bảng "cha" có thể được tham chiếu bởi một hoặc nhiều hàng trong bảng "con". Khóa ngoại thường gợi ý cách bạn nên

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
4 bảng trong hầu hết các truy vấn. Một bảng cũng có thể tham chiếu đến chính nó, như một trường hợp đặc biệt

Ràng buộc

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
5 là một cấu trúc cơ sở dữ liệu, một triển khai buộc tính toàn vẹn của mối quan hệ khóa ngoại [tính toàn vẹn tham chiếu]. Cụ thể, nó đảm bảo rằng một bảng con chỉ có thể tham chiếu đến một bảng cha khi tồn tại hàng thích hợp trong bảng cha. Một ràng buộc cũng ngăn chặn sự tồn tại của "các hàng mồ côi" trong các phương thức khác nhau, như bạn sẽ sớm thấy được mô tả

PlanetScale không hỗ trợ ràng buộc

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
5

Bạn được khuyến khích sử dụng mô hình quan hệ và liên kết các bảng bằng cách "chỉ" các hàng từ bảng này sang bảng khác. Đó chỉ là việc thực thi ở cấp cơ sở dữ liệu, định nghĩa

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7, không được phép trong lược đồ của bạn

Chúng ta sẽ sớm trình bày một ví dụ về sơ đồ trông như thế nào để sự khác biệt nhỏ này trở nên rõ ràng.

Có hai lý do kỹ thuật chính khiến các ràng buộc khóa ngoại không được hỗ trợ

  1. Cách các ràng buộc
    CREATE TABLE parent_table [
      id INT NOT NULL,
      PRIMARY KEY [id]
    ];
    
    CREATE TABLE child_table [
      id INT NOT NULL,
      parent_id INT,
      PRIMARY KEY [id],
      KEY parent_id_idx [parent_id]
    ];
    
    5 được triển khai trong MySQL [hay đúng hơn là trong công cụ lưu trữ InnoDB] can thiệp vào các hoạt động DDL trực tuyến. Tìm hiểu thêm trong bài đăng trên blog Vitess này
  2. Giới hạn trong phạm vi máy chủ MySQL duy nhất, không thể duy trì các ràng buộc
    CREATE TABLE parent_table [
      id INT NOT NULL,
      PRIMARY KEY [id]
    ];
    
    CREATE TABLE child_table [
      id INT NOT NULL,
      parent_id INT,
      PRIMARY KEY [id],
      KEY parent_id_idx [parent_id]
    ];
    
    5 khi dữ liệu của bạn tăng lên và được phân chia trên nhiều máy chủ cơ sở dữ liệu. Điều này thường xảy ra khi bạn giới thiệu phân vùng/phân đoạn chức năng và/hoặc phân đoạn ngang

Chúng tôi tin rằng các ưu điểm của DDL trực tuyến như phân nhánh, triển khai và thay đổi lược đồ do nhà phát triển sở hữu, thay đổi lược đồ không chặn, v.v. và lợi ích của sharding như một phương tiện mở rộng quy mô không giới hạn, vượt trội hơn lợi ích ràng buộc của

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
5

Nói cách khác, nếu bạn thực thi tính toàn vẹn tham chiếu ở cấp ứng dụng thay vì ở cấp cơ sở dữ liệu, bạn sẽ mở ra cơ hội cho tất cả những lợi ích đó

Ghi chú

Bạn vẫn có thể nghĩ về các mối quan hệ khóa ngoại; . Bạn có thể cấu trúc các bảng của mình theo cùng một cách chính xác mà không có các ràng buộc FOREIGN KEY như khi bạn thực hiện với các ràng buộc. Đó chỉ là cách các mối quan hệ này được thực thi thay đổi

Để hiểu cách làm việc mà không có ràng buộc khóa ngoại, trước tiên chúng ta phải hiểu chức năng của khóa ngoại

Xem xét mối quan hệ bảng cha-con tầm thường sau đây

SQL

Đã sao chép

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id],
  CONSTRAINT `child_parent_fk` FOREIGN KEY [parent_id] REFERENCES parent_table[id] ON DELETE NO ACTION
];

Mẹo

Trong MySQL, các khóa ngoại chỉ được triển khai bởi lớp công cụ lưu trữ, cụ thể là công cụ InnoDB mặc định và phổ biến. Ràng buộc FOREIGN KEY không phải là một thực thể riêng biệt. Nó nằm trong không gian bảng của đứa trẻ

Có sẵn ràng buộc

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
5 để xóa hàng [
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
1] và cập nhật hàng [
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
2]. Trong tài liệu này, chúng tôi thảo luận về
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
1 vì nó có tác động mạnh hơn trong hai. Cuộc thảo luận cũng liên quan đến các ràng buộc của
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
2

Khóa ngoại hỗ trợ thêm ba loại hành động [được minh họa bên dưới cho

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
1]

Đây là loại hành động tham lam, hoặc tham vọng nhất. Nếu bạn

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 một hàng từ bảng cha, mọi hàng tham chiếu trong bảng con sau đó sẽ bị xóa trong cùng một giao dịch. Hoạt động này chạy đệ quy cho tất cả con cái của cha mẹ, cũng như cho con cái của họ, nếu họ cũng sử dụng
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
6

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
6 là một hành động rủi ro và tiêu tốn tài nguyên. Bạn định
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 một hàng, nhưng cuối cùng lại xóa hàng trăm, hàng nghìn hoặc nhiều hàng trong nhiều bảng. Những gì có vẻ giống như một giao dịch đơn giản giờ đây biến thành một hoạt động lớn, liên quan đến việc khóa quá mức, tăng chi phí MVCC, ảnh hưởng đến độ trễ sao chép, v.v.

Nhưng có lẽ mối nguy hiểm lớn nhất là khả năng mất dữ liệu bất ngờ. Liệu một nhà phát triển không nghi ngờ có đơn giản cho rằng một

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
01 sẽ xóa tối đa một hàng hay không, dẫn đến hành vi đáng ngạc nhiên, chẳng hạn như trong các truy vấn
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
02, thực sự chạy một
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 ngầm, dẫn đến việc phá hủy hàng loạt dữ liệu

Việc sử dụng

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
6 đang gây tranh cãi. Sử dụng nó một cách cẩn thận. Cân nhắc sử dụng
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
05 để thay thế

Với thiết lập này, một

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 trên cha mẹ [e. g.
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
01] sẽ đặt cột tham chiếu cho trẻ em [e. g.
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
09 cột trong
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
40] đến
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
41 cho các hàng phù hợp. Nó thực sự dẫn đến các hàng mồ côi, không khác lắm so với việc không có ràng buộc khóa ngoại nào cả

Một lợi thế là dễ dàng xác định các hàng mồ côi. những hàng đó và chỉ những hàng đó sẽ có

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
41 cho các cột tham chiếu gốc

Giống như

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
43, việc xóa một hàng trên bảng mẹ có thể dẫn đến nhiều hàng được cập nhật trên các bảng con. Điều này một lần nữa có thể gây ra các giao dịch lớn, khóa quá mức và độ trễ sao chép

Có thể là tính năng quan trọng nhất của khóa ngoại, một

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 trên khóa gốc sẽ không thành công nếu các hàng con tồn tại tham chiếu đến hàng của cha mẹ. Để
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 hàng từ cấp độ gốc, ứng dụng/người dùng trước tiên phải
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 hàng tham chiếu từ tất cả cấp độ con. Theo cách đệ quy, nếu các bảng đó được tham chiếu thêm bởi các bảng khác, thì ứng dụng/người dùng trước tiên phải
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 hàng từ các cháu, v.v.

Loại hành động này [hoặc thiếu loại hành động này] buộc ứng dụng phải có quyền sở hữu mạnh mẽ hơn đối với dữ liệu của mình. Một ứng dụng được viết để hoạt động với

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
44 sẽ phát triển một cách hữu cơ khi biết bảng nào tham chiếu đến bảng nào khác và sẽ thiết lập các luồng
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7/
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
51 lặp qua các bảng theo đúng thứ tự để đáp ứng tính toàn vẹn tham chiếu

Lược đồ trên sẽ trông giống hệt nhau, trừ đi mệnh đề

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
52

SQL

Đã sao chép

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];

Mẹo

Mỗi ràng buộc FOREIGN KEY yêu cầu một chỉ mục bao gồm [các] cột được tham chiếu ở cả hai phía của kết nối. Chỉ mục parentid_idx được ràng buộc _required. Chúng tôi có thể thả khóa đó vào bảng không ràng buộc của mình, tùy thuộc vào loại truy vấn mà chúng tôi có thể sử dụng để truy xuất dữ liệu từ các bảng

Xem xét lại hành vi của ứng dụng trong thiết lập

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
44. ứng dụng biết các thành phần phụ thuộc của bảng, xử lý thứ tự lặp cho
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7/
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
51. Nó làm mọi thứ đúng

Điều gì xảy ra nếu chúng tôi loại bỏ

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
52 vào thời điểm này?

Ứng dụng không thay đổi. Nó đã chạy các hành động phù hợp theo đúng thứ tự. Thao tác ứng dụng kết thúc việc chạy

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
01 thành công với thao tác ứng dụng mà
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 [các] bảng con. Mặc dù chúng tôi mất sự đảm bảo an toàn của cơ sở dữ liệu khi thực thi hành vi này, nhưng chúng tôi hoàn toàn có khả năng tự quản lý nó

Tương tự như vậy, một ứng dụng phát triển với lược đồ không ràng buộc sẽ tự học cách xử lý các tình huống

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 và
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
51. Trên thực tế, nó được trao thêm một số quyền tự do vì thứ tự hoạt động không được thi hành. Đây là một lợi thế vì ứng dụng không bị buộc phải
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 nghìn hàng phụ thuộc cho mỗi lần xóa hàng gốc trong cùng một giao dịch. Ứng dụng cũng có thể trì hoãn việc xóa khi chúng ta thảo luận ngay sau đây

Toàn vẹn tham chiếu chỉ là một trong nhiều ràng buộc toàn vẹn dữ liệu logic. Nó chỉ tình cờ là một cơ sở dữ liệu có thể thực thi. Bất kỳ ứng dụng lớn nào cũng sẽ duy trì tính toàn vẹn của dữ liệu với các quy tắc mà cơ sở dữ liệu không biết

Xem xét một ràng buộc

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
06. Điều gì xảy ra với các hàng con được đặt thành
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
41? . Ví dụ, một truy vấn có thể
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
54 hàng
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
55. Tốt hơn nữa, các hàng con thường được
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
4ed với các hàng cha tương ứng của chúng. Bất kỳ truy vấn nào chạy một
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
4 như vậy sẽ trả về trống vì hàng chính không tồn tại

Cuối cùng, những hàng đó sẽ chồng chất và bạn sẽ muốn lấy lại không gian

Nếu không có ràng buộc

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
5, tình huống sẽ rất giống nhau, Có thể
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 hàng cha mà không xóa các hàng con phụ thuộc của nó. Một hàng con
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
4ed với một hàng cha [đã xóa] tương ứng sẽ trống. Không có
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
71 để giúp bạn, nhưng việc xác định những hàng đó vẫn còn tầm thường. Tương tự như vậy, có rất ít hoặc không có thiệt hại nào trong việc giữ những hàng đó trong một thời gian.

Và tương tự, những hàng đó cuối cùng chồng chất

Một thực tế phổ biến, khi thích hợp, là

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 hàng trên bảng cha hoặc cũng có thể trên một tập hợp con của bảng con, nhưng để lại một số bảng khác để xử lý hàng loạt ngoại tuyến

Vào một số thời điểm thuận tiện, chẳng hạn như giờ có lưu lượng truy cập thấp, ứng dụng hoặc một số công việc hàng loạt sẽ xóa các hàng mồ côi. Hãy xem xét truy vấn đơn giản hóa này

SQL

Đã sao chép

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
0

Một

CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
7 duy nhất có khả năng là một hoạt động lớn, cần tránh. Một cách thực hành tốt là chia câu lệnh thành nhiều câu lệnh có phạm vi nhỏ, chẳng hạn như. g. xóa
CREATE TABLE parent_table [
  id INT NOT NULL,
  PRIMARY KEY [id]
];

CREATE TABLE child_table [
  id INT NOT NULL,
  parent_id INT,
  PRIMARY KEY [id],
  KEY parent_id_idx [parent_id]
];
74 hàng cùng một lúc

Bạn có thể có khóa ngoại mà không bị ràng buộc không?

Khóa ngoại không có ràng buộc . Thay vào đó, bạn có thể định cấu hình hai bảng sao cho bảng này đề cập đến bảng kia nhưng không có bất kỳ khóa ngoại được xác định nào. You don't have to configure a foreign key constraint on a column just because it refers to another column. You could instead configure two tables such that one refers to the other, but without any defined foreign key.

Những ràng buộc nào được áp dụng trên khóa ngoại?

Ràng buộc FOREIGN KEY được sử dụng để ngăn chặn các hành động phá hủy liên kết giữa các bảng. KHÓA NGOÀI là một trường [hoặc tập hợp các trường] trong một bảng, tham chiếu đến KHÓA CHÍNH trong một bảng khác

Các yêu cầu cho một trường khóa ngoại là gì?

Khóa ngoại là một cột [hoặc tổ hợp các cột] trong bảng có giá trị phải khớp với giá trị của cột trong một số bảng khác. Ràng buộc FOREIGN KEY thực thi tính toàn vẹn tham chiếu, về cơ bản nói rằng nếu giá trị cột A đề cập đến giá trị cột B, thì giá trị cột B phải tồn tại .

Tại sao nên thêm khóa ngoại ràng buộc?

Sử dụng ràng buộc khóa ngoại giúp chúng tôi đảm bảo rằng chỉ dữ liệu có thể được liên kết với bảng được tham chiếu mới có thể được nhập vào cơ sở dữ liệu của chúng tôi .

Chủ Đề