2

我正在尝试设置一个 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,它拥有的每个外键,以及每个唯一键(不是键具有多个元素的情况,例如上面的唯一键,这是通过具有相同的密钥号)。

我猜我需要使用 sysobject、syscolumns、syskeys 和 sysconstraints,但我似乎无法弄清楚它们是如何相互链接的。

谢谢卡尔
_

4

1 回答 1

3

这是一个开始:

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)

它不包括密钥 ID,因为我想您可以以某种方式散列非空表 ID 和 keyN 列以生成密钥的唯一 ID。

它也不包括唯一索引。为此,您需要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'

查看sysindexes 的 Sybase 手册页,了解如何过滤它。

于 2011-02-18T08:04:11.740 回答