Идентификация таблиц Sybase, полей, ключей, ограничений
Я пытаюсь настроить запрос Sybase, который даст мне следующий вывод:
Table KeyType KeyNumber Column
table1 PK 1 table1_id
table1 FK 2 table2_id
table1 FK 3 table3_id
table1 FK 4 table4_id
table1 Unique 5 table1_abc
table1 Unique 5 table1_def
Другими словами, мне нужен PK для каждой таблицы и каждого внешнего ключа, который у нее есть, а также каждого уникального ключа (кроме случаев, когда ключ имеет более одного элемента, например, указанный выше уникальный ключ, это определяется наличием одинакового ключа). KeyNumber).
Я предполагаю, что мне нужно использовать sysobject, syscolumns, syskeys и sysconstraints, но я не могу понять, как они взаимосвязаны.
Спасибо
Карл
1 ответ
Это начало:
SELECT
t.name,
CASE k.type
WHEN 1 THEN 'PK'
WHEN 2 THEN 'FK'
WHEN 3 THEN 'Common'
END,
c.name
FROM
sysobjects t INNER JOIN
syscolumns c ON c.id = t.id INNER JOIN
syskeys k ON k.id = t.id AND c.colid IN (k.key1, k.key2, k.key3, k.key4, k.key5, k.key6, k.key7, k.key8)
WHERE
t.type = 'U' AND k.type in (1,2)
Он не включает идентификатор ключа, для этого, я думаю, вы могли бы как-то хэшировать ненулевой идентификатор таблицы и столбцы keyN, чтобы получить уникальный идентификатор для ключа.
Он также не включает уникальные индексы. Для этого вы хотели бы UNION
с чем-то вроде:
SELECT
t.name,
'Unique',
c.name
FROM
sysobjects t INNER JOIN
syscolumns c ON c.id = t.id INNER JOIN
sysindexes i ON i.id = t.id
WHERE t.type = 'U'
Посетите страницу справки Sybase, чтобы узнать, как ее фильтровать.