Идентификация таблиц 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, чтобы узнать, как ее фильтровать.

Другие вопросы по тегам