2013-03-31 37 views
5

bàn của tôi là một cái gì đó giống nhưOracle SQL hạn chế duy nhất A đến B, B đến A

 
FROM TO  DISTANCE    
------ ---- ---------- 
A  B 100 
B  C 100 
Z  A 120 

tôi cần phải thêm một ràng buộc tới bảng đó sẽ không cho phép chèn B A 100 hay C B 100 hoặc A Z 120

tôi có một số PRIMARY KEY (from, to)CONSTRAINT const_u UNIQUE (to, from) nhưng nó không hoạt động như mong đợi.

EDIT: Tôi cũng không thể buộc thứ tự đúng theo thứ tự bảng chữ cái khi chèn, vì tôi không có quyền truy cập vào logic chèn EDIT # 2: Bạn có thể thêm B A 50 không? - không, bạn không thể. Chỉ nên có một khoảng cách duy nhất từ ​​A đến B hoặc B đến A chứ không phải cả hai cùng một lúc.

+0

Tôi khuyên bạn nên tạo trình kích hoạt và chk để đối sánh paris – Akash

+0

tôi không thể tạo trình kích hoạt. tôi phải giải quyết vấn đề theo cách khác. – zeal

+1

Bạn có thể thêm 'B A 50' không? –

Trả lời

10
create unique index on the_table (least(from,to), greatest(from,to)); 

sẽ ngăn chặn thêm (B, A, 100) if (A, B, 100) là đã có trong bảng.

+0

'tạo chỉ mục index_name duy nhất trên the_table (ít nhất (từ, đến), lớn nhất (từ, đến));' hoạt động như nét duyên dáng, cảm ơn bạn :) – zeal

2

Nếu bạn sẵn sàng để làm điều này một quy tắc, bạn có thể thử một hạn chế CHECK:

CONSTRAINT force_collation CHECK (FROM < TO) 
+2

nó tốt cho một trường hợp cụ thể, nhưng nếu tôi muốn lưu 'Z A 100' nó sẽ thất bại mặc dù' A Z 100' không có trong bảng ... – zeal

+0

Nhưng bạn vẫn có thể lưu A Z 100, không? Đó là lý do tại sao anh ấy nói "nếu bạn sẵn sàng làm điều này một quy tắc". – DCookie

+0

có, nhưng tôi không thể ép buộc thứ tự chữ cái khi chèn các giá trị! – zeal

Các vấn đề liên quan