Идентификация таблиц Sybase, полей, ключей, ограничений - PullRequest
2 голосов
/ 09 февраля 2011

Я пытаюсь настроить запрос 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, но я не могу понять, как они взаимосвязаны.

Спасибо
Karl

1 Ответ

3 голосов
/ 18 февраля 2011

Это начало:

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 для sysindexes о том, как его фильтровать.

...