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

Ràng buộc MySQL Cross Table

Bạn có thể sử dụng bảng "loại":

CREATE TABLE Type
  ( type_code CHAR(1) NOT NULL
  , PRIMARY KEY (type_code)
  ) ;

với chính xác 2 hàng (bao nhiêu bảng loại phụ khác nhau mà bạn cần:

INSERT INTO Type (type_code)
VALUES ('B'), ('C') ;

Bảng supertype (bao gồm một cột tham chiếu đến "Loại"):

CREATE TABLE A
  ( a_id INT NOT NULL AUTO_INCREMENT
  , type_code CHAR(1) NOT NULL
  , PRIMARY KEY (a_id)
  , UNIQUE KEY (type_code, a_id)
  , FOREIGN KEY (type_code)
      REFERENCES Type (type_code)
  ) ;

Các bảng kiểu con (hiện đang tham chiếu đến sự kết hợp của Khóa chính của A và type_code:

CREATE TABLE B
  ( a_id INT NOT NULL
  , type_code CHAR(1) NOT NULL DEFAULT 'B'
  , PRIMARY KEY (type_code, a_id)
  , FOREIGN KEY (type_code, a_id)
      REFERENCES A (type_code, a_id)
  , CHECK (type_code = 'B')
  ) ;

CREATE TABLE C
  ( a_id INT NOT NULL
  , type_code CHAR(1) NOT NULL DEFAULT 'C'
  , PRIMARY KEY (type_code, a_id)
  , FOREIGN KEY (type_code, a_id)
      REFERENCES A (type_code, a_id)
  , CHECK (type_code = 'C')
  ) ;

Ở trên sẽ hoạt động tốt, chỉ cần MySQL thực hiện CHECK hạn chế. Nhưng nó đã không. Vì vậy, để hoàn toàn chắc chắn rằng tất cả các thông số kỹ thuật của bạn đều được thực thi, chứ không phải 'B' dữ liệu kiểu được chèn vào C bảng, bạn sẽ phải thêm 2 bảng "loại" nữa (và xóa cái vô dụng trong MySQL CHECK ràng buộc):

CREATE TABLE TypeB
  ( type_code CHAR(1) NOT NULL
  , PRIMARY KEY (type_code)
  ) ;

CREATE TABLE TypeC
  ( type_code CHAR(1) NOT NULL
  , PRIMARY KEY (type_code)
  ) ;

với chính xác 1 hàng mỗi:

INSERT INTO TypeB (type_code)
VALUES ('B') ;

INSERT INTO TypeC (type_code)
VALUES ('C') ;

và các FK bổ sung:

ALTER TABLE B
  ADD FOREIGN KEY (type_code)
    REFERENCES TypeB (type_code) ;

ALTER TABLE C
  ADD FOREIGN KEY (type_code)
    REFERENCES TypeC (type_code) ;

Với những ràng buộc này, mọi hàng của bảng A, sẽ thuộc loại B hoặc C và nó sẽ nằm trong bảng tương ứng (B hoặc C) và không bao giờ ở cả hai.

Nếu bạn cũng muốn đảm bảo rằng chúng sẽ nằm trong chính xác một bảng (và không bao giờ nằm ​​trong cả B và C), điều đó nên được cẩn thận khi chèn vào A (tất cả các lần chèn phải được thực hiện với một giao dịch thực thi yêu cầu đó).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. REPLACE không phân biệt chữ hoa chữ thường trong MySQL?

  2. Làm cách nào để truy xuất tệp từ thư mục máy chủ bằng PHP và hiển thị / tải tệp đó xuống trang web bằng javascript?

  3. Làm thế nào để lấy Tổng từ hai bảng?

  4. PHP / MYSQLI:mysqli_query không thành công trong PHP

  5. Lợi thế của việc sử dụng Chế độ xem trong MySQL