2009-05-10 35 views
5

Trong máy chủ Derby, làm cách nào bạn có thể sử dụng thông tin trong các bảng hệ thống của lược đồ để tạo một câu lệnh chọn để truy xuất các tên ràng buộc cho mỗi bảng?Derby - ràng buộc

Trả lời

6

Hướng dẫn có liên quan là Derby Reference Manual. Có rất nhiều phiên bản có sẵn: 10.13 là hiện vào tháng Tư năm 2017, nhưng nó đã được 10,3 tháng năm 2009.

câu trả lời gốc

SELECT c.constraintname, t.tablename 
    FROM sysconstraints c, systables t 
    WHERE c.tableid = t.tableid; 

Kể từ khi phiên bản đầy đủ gần đây của Derby đòi hỏi rằng các bảng danh mục hệ thống được bắt đầu bởi sys. (10.13 được trích dẫn bởi kiwicomb123 trong một comment), bạn có thể sửa đổi các truy vấn để sử dụng rõ ràng THAM GIA ký hiệu quá, và sử dụng:

SELECT c.constraintname, t.tablename 
    FROM sys.sysconstraints c 
    JOIN sys.systables t 
    ON c.tableid = t.tableid; 

Bạn có thể thêm cột bổ sung - ví dụ: c.type để nhận loại ràng buộc.

+0

Có cách nào để biết loại ràng buộc không? –

+1

Tôi đoán tôi có thể RTFM cho bạn. Sysconstraints.Type là một trường CHAR (1) có một trong các giá trị 'U' (Duy nhất), 'P' (Chính), 'F' (khóa ngoại) hoặc 'C' (Kiểm tra). Tuy nhiên, khi được đưa ra các tài liệu hướng dẫn, nó thường là hợp lý để đi và đọc tài liệu. –

+0

Truy vấn này không hoạt động trong Derby 10.13, bạn phải đặt trước tên bảng sysconstraints và sysconstraints với "sys". Ví dụ: Sử dụng sys.sysconstraints thay vì sysconstraints. – kiwicomb123

2
SELECT sc.schemaname, co.constraintname, t.tablename, cg.descriptor, t2.tablename, cg2.descriptor, f.deleterule, f.updaterule 
FROM sys.sysconstraints co 
JOIN sys.sysschemas sc ON co.schemaid = sc.schemaid 
JOIN sys.systables t ON co.tableid = t.tableid 
JOIN sys.sysforeignkeys f ON co.constraintid = f.constraintid 
JOIN sys.sysconglomerates cg ON f.conglomerateid = cg.conglomerateid 
JOIN sys.sysconstraints co2 ON f.keyconstraintid = co2.constraintid 
JOIN sys.systables t2 ON co2.tableid = t2.tableid 
JOIN sys.syskeys k ON co2.constraintid = k.constraintid 
JOIN sys.sysconglomerates cg2 ON k.conglomerateid = cg2.conglomerateid 
WHERE co.type = 'F' 
    and sc.schemaname = current schema  

hai mục mô tả chứa một danh sách các số cột cho mỗi bảng, giống như

BTREE (2,1)

nơi các con số tương ứng với số cột trong bảng syscolumns cho bảng tương ứng.

Nếu có ai có cách trích xuất trang nhã này trong truy vấn này, tôi muốn biết. Tôi nhận được một danh sách tất cả các cột cho một bảng trong một truy vấn riêng biệt và trích xuất các tên từ đó sau khi phân tích các bộ mô tả để lấy các số.