2009-05-10 4 views
5

На сервере Derby, как вы можете использовать информацию в системных таблицах схемы для создания оператора select, чтобы получить имена ограничений для каждой таблицы?Derby - ограничения

ответ

6

Соответствующее руководство - Derby Reference Manual. Есть много версий доступны: 10,13 был ток в апреле 2017 года, но это было 10,3 в мае 2009.

Оригинальный ответ

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

Поскольку достаточно поздние версии Derby требуют таблиц системного каталога предваряется sys. (10,13 цитирует kiwicomb123 в comment), вы можете пересмотреть запрос использовать явный РЕГИСТРИРУЙТЕСЬ обозначения тоже, и использование:

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

Вы можете добавить дополнительные столбцы - например, c.type, чтобы получить тип ограничения.

+0

Есть ли способ узнать тип ограничения? –

+1

Я предполагаю, что смогу RTFM для вас. Sysconstraints.Type - это поле CHAR (1), которое имеет одно из значений «U» (уникальное), «P» (первичное), «F» (внешний ключ) или «C» (проверка). Однако, при указании указателей на документацию, обычно разумно идти и читать документацию. –

+0

Этот запрос не работает в Derby 10.13, вы должны префикс имен системных имен sysconstraints и sysconstraints с помощью «sys.». Например: Используйте sys.sysconstraints вместо 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  

две записи дескрипторов содержит список номеров столбцов для каждой таблицы, как

ВТКЕЙ (2,1)

где цифры соответствуют номерам столбцов в таблице SYSCOLUMNS для соответствующая таблица.

Если у кого-то есть изящный способ извлечения этого в этом запросе, я хотел бы знать. Я получаю список всех столбцов для таблицы в отдельном запросе и извлекаю имена из них после разбора дескрипторов для получения чисел.