Giả sử tôi có một bảng A, có hai cột: một là ID cho ThingA
và một là ID cho ThingB
. Chìa khóa chính là (ThingA, ThingB)
.
Tiếp theo, tôi có một bảng thứ hai, nhưng lần này nó bị giới hạn ở các mục trong bảng A
có ThingB = 3
. Khóa chính là ThingA
, bởi vì ThingB
hằng số là 3.
Ban đầu, tôi đã nghĩ rằng tôi có thể đơn giản:
FOREIGN KEY (ThingA, 3) REFERENCES A(ThingA, ThingB)
Nhưng tôi đã học được rằng đó không phải là trường hợp và tôi phải tạo một cột cho ThingB
:
ThingB INT NOT NULL DEFAULT(3) CHECK(ThingB = 3)
Sau đó,
FOREIGN KEY (ThingA, ThingB) REFERENCES A (ThingA, ThingB)
Có một giải pháp thay thế nào không yêu cầu thêm cột hay DEFAULT + CHECK
không? Một thay thế là một cột được tính toán bền bỉ, nhưng tôi ghét ý tưởng đó vì về cơ bản nó là một mánh gian lận và vẫn thêm một cột mới với lưu trữ vật lý. Mặc dù trên chính nó, INT
sẽ không lớn, có vài triệu hàng cần nó trên một số bảng và tôi không muốn duy trì các cột bổ sung.
Dưới đây là mẫu DDL để minh họa tình huống:
CREATE TABLE Test1
(
ThingA INT NOT NULL,
ThingB INT NOT NULL,
PRIMARY KEY (ThingA, ThingB)
);
CREATE TABLE Test2
(
ThingAVal INT NOT NULL,
ThingBVal INT NOT NULL DEFAULT(3) CHECK(ThingBVal = 3),
Val INT NOT NULL,
FOREIGN KEY (ThingAVal, ThingBVal) REFERENCES Test1 (ThingA, ThingB)
);
Và tôi đã tạo một db <> fiddle thể hiện giải pháp (hiện tại) của mình:
Nếu câu trả lời là "Không", tôi sẽ chấp nhận nó, nhưng tôi tò mò liệu có lựa chọn thay thế nào khác không .
SMALLINT
sản phẩm, tôi chỉ ước có một cách tốt hơn để liên kết nó. Tôi có thể loại bỏ A
hoàn toàn, vì tôi thực sự không cần nó, và chỉ thực hiện tính toàn vẹn tham chiếu thông qua ThingA
, do đó cho phép tôi loại bỏ ThingB
.
UNIQUE
ràng buộc (ThingA, ThingB)
không?
TINYINT
, nếu số lượng giá trị có thểThingB
là nhỏ.