Tôi có thể đảm bảo hai cột không có cùng giá trị không


11

Nếu tôi có một cái bàn trông như thế này

CREATE TABLE foo (
   id INT NOT NULL AUTO_INCREMENT,
   aa INT NOT NULL,
   bb INT NOT NULL,
   PRIMARY KEY (id),
   UNIQUE KEY (aa, bb),
   CONSTRAINT aa_ref FOREIGN KEY (aa) REFERENCES bar (id),
   CONSTRAINT bb_ref FOREIGN KEY (bb) REFERENCES bar (id)
)

Có cách nào để đảm bảo rằng aa != bbbên cạnh việc sử dụng logic cấp độ ứng dụng hoặc buộc kích hoạt không thành công trên TRƯỚC KHI CHỨNG MINH?

Câu trả lời:


3

MySQL không hỗ trợ CHECKtrực tiếp các điều khoản, mặc dù nếu bạn có một phiên bản đủ gần đây, nó hỗ trợ các trình kích hoạt và phát sinh lỗi SIGNAL, do đó bạn có thể xác định BEFORE INSERTBEFORE UPDATEkích hoạt kiểm tra dữ liệu và đưa ra lỗi nếu các ràng buộc dự định không được thỏa mãn.

Tất nhiên, điều này sẽ kém hiệu quả hơn so với hỗ trợ riêng cho các ràng buộc kiểm tra, vì vậy nếu bạn đang thực hiện một khối lượng lớn ghi vào cấu trúc đó, hãy chắc chắn để phân tích sự khác biệt hiệu suất do trình kích hoạt gây ra trong trường hợp nó gây hại cho ứng dụng của bạn quá nhiều.


8

Không, bạn không thể. Trong hầu hết các DBMS (Postgres, SQL-Server, Oracle, DB2 và nhiều thứ khác), bạn chỉ có thể thêm một CHECKràng buộc:

ALTER TABLE foo 
  ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
    CHECK (aa <> bb) ;

Tôi không thấy bất kỳ cách nào để có điều này trong MySQL, chỉ sử dụng các ràng buộc tham chiếu. Bên cạnh các kích hoạt, bạn có thể cho phép hai cột có giá trị bằng nhau và chỉ cần bỏ qua các hàng bằng cách luôn truy cập bảng thông qua chế độ xem:

CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;

Ngoài ra, bạn có thể hạn chế các thao tác Chèn và Cập nhật thông qua các quy trình (được lưu trữ) chăm sóc ràng buộc và không cho phép dữ liệu được chèn (hoặc thay đổi) không thỏa mãn nó.



-1

Cả hai cột trong câu hỏi tham chiếu đến cùng một bảng Bar. Bạn có thể chia bảng Bar thành hai để chúng chứa id với các bộ giá trị khác nhau không?


1
Sau đó, nói rằng chúng tôi có ba cặp vợ chồng trong Foobảng : (1,2) (2,3) (3,1). Làm thế nào chúng ta nên chia ba giá trị?
ypercubeᵀᴹ

1
Tôi đồng ý, gợi ý nhầm.
msi77
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.