回答

收藏

识别Sybasetables, fields, keys, constraints

技术问答 技术问答 338 人阅读 | 0 人回复 | 2023-09-14

正在尝试设置一个Sybase查询,该查询将为我提供以下输出:. E/ ?/ G/ F& ~$ O
Table     KeyType      KeyNumber      Column+ X8 i! D* Q+ B: y% b" f* l
table1    PK           1              table1_id
, f! Q2 i6 A/ z  Dtable1    FK           2              table2_id   
4 e3 R1 _6 T0 |# E: Z6 c# Vtable1    FK           3              table3_id. U4 y6 j- J: o8 C  z
table1    FK           4              table4_id
. X4 W: g" }; |table1    Unique       5              table1_abc" M5 z9 \- C# G2 r  D
table1    Unique       5              table1_def7 w: A2 W* T$ m/ Z
1 h4 F, ^+ j1 R+ T- Z; w5 w
换句话说,我需要每个表的PK,它具有的每个外键以及每个唯一键(不是一个键具有多个元素(例如上面的唯一键)的地方,是通过具有相同的PK来标识的。键号)。
- Y$ Y% D& h% _! c我猜我需要使用sysobject,syscolumns,syskeys和sysconstraints,但我似乎无法弄清楚它们如何相互链接。
3 P2 r- i: b6 O$ u8 U- E1 w3 Y                / a$ [) W  k) L% \6 j, z9 D/ |
解决方案:1 b' y% |8 `# }
                + |5 N/ q$ |" N& S% \/ v+ G
! P, p& i* w& Q. e1 X% e2 v5 @! U* p

$ I) c* Y* i6 g3 ?; {                这是一个开始:8 k1 l; ~9 U: R. r( d9 \+ d
SELECT
) G( Z5 X$ f  y7 s" `; T7 U    t.name,
: V& a6 g/ ~; e    CASE k.type
6 i3 g& d- X2 q        WHEN 1 THEN 'PK'
5 u4 L# y# N8 i/ [2 K: z        WHEN 2 THEN 'FK'
3 z, M' E# _) m5 b" N# p        WHEN 3 THEN 'Common'
6 p9 S& f' A# n8 T! J3 Y9 M4 }    END,
) q4 g; ^  T+ S- |  F1 j    c.name( h; ]+ N4 M# E9 A) Y5 i" y0 y
FROM + ^# J9 m5 Y( Q2 s' l5 N; t
    sysobjects t INNER JOIN
: j% E7 i5 S! I/ R5 W  t    syscolumns c ON c.id = t.id INNER JOIN
, y  Y# v( Z, D6 T    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)2 y3 ~: h1 ^, G5 s: x
WHERE / y8 p1 R* V4 W6 h7 D
    t.type = 'U' AND k.type in (1,2)
* r" X, Q) Q& F2 Z3 L* c
( i# T3 x* b) [. M9 G它不包含键ID,因为我想您可能会以某种方式对非空表ID和keyN列进行哈希处理以产生键的唯一ID。1 q& k) ], b% _* N9 e; K; @% ]
它还不包括唯一索引。为此,您需要采取UNION以下措施:
' S* F4 a* K  k" L5 u  vSELECT
# C5 _$ @: R3 l. b    t.name, 2 ^; j9 V1 v* O$ W$ a4 |
    'Unique',
/ k& ~' a) G/ V0 @5 a( {6 n    c.name
  j" A) v+ ~( x, e7 ^% i# h7 VFROM   }7 n0 _1 U% W9 e+ D. F, D
    sysobjects t INNER JOIN
+ Q# @) U% u& p0 D; f: [1 P    syscolumns c ON c.id = t.id INNER JOIN
% S6 ?2 v/ C7 k) l% S    sysindexes i ON i.id = t.id
7 j8 ^6 d0 d  a( l: WWHERE t.type = 'U'
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则