回答

收藏

识别Sybasetables, fields, keys, constraints

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

正在尝试设置一个Sybase查询,该查询将为我提供以下输出:) A3 \% }7 J/ c3 x" o' Y" D
Table     KeyType      KeyNumber      Column0 b% Y- I( k, L/ [  l& R8 c' [
table1    PK           1              table1_id
* t' X& N/ W9 ^+ Z/ V2 V6 Z* l2 H8 \& qtable1    FK           2              table2_id    " ^3 m# m1 F5 S
table1    FK           3              table3_id3 o5 r9 \# v7 Q2 _# V9 `( x9 N
table1    FK           4              table4_id
. G$ E( D, G7 r$ J) S# v6 |) ntable1    Unique       5              table1_abc
9 |0 d" ^# z& `- Y9 ^' P6 mtable1    Unique       5              table1_def7 X4 n7 b2 D* E! n
* F; D, l; E; C
换句话说,我需要每个表的PK,它具有的每个外键以及每个唯一键(不是一个键具有多个元素(例如上面的唯一键)的地方,是通过具有相同的PK来标识的。键号)。
" P7 O5 @: t  x$ P8 S! b% m) t我猜我需要使用sysobject,syscolumns,syskeys和sysconstraints,但我似乎无法弄清楚它们如何相互链接。
$ {8 ?$ h' A, n                # @/ e/ j$ C$ z2 j4 s1 d) \
解决方案:
  ~( c8 ]  _; i  }+ R0 v                / G5 |- g+ z5 \5 O. \$ `

# s- e+ T% o( o3 m( c6 D1 j& n$ w* E* O
                这是一个开始:
: b& G! u# T6 C2 q; I1 JSELECT " k- W1 }! m! A( L# Y- O- w
    t.name, % G( X. e# ]4 A( `9 e% T5 t
    CASE k.type & c+ l" @0 w! g3 J+ s
        WHEN 1 THEN 'PK' : T5 ]( n6 N+ E9 d+ i
        WHEN 2 THEN 'FK'4 ]( a8 p2 o0 A0 d! |5 Z
        WHEN 3 THEN 'Common'$ Y8 e6 u/ y8 p. u& S( }2 I
    END,
) ?6 i; Z; v3 O; d# E& B    c.name
1 f2 w& a9 u9 a" m0 |2 fFROM
/ K* C3 A2 K+ G  I5 |    sysobjects t INNER JOIN / h, S% {' I& {4 F* ]
    syscolumns c ON c.id = t.id INNER JOIN
6 [$ o$ V! C4 L: m/ l& V7 c    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)
' \. E0 o9 S. Y2 Y; S1 L8 fWHERE . Q- U0 m7 L" x, L
    t.type = 'U' AND k.type in (1,2)
4 S* N$ N; w0 `- |5 L. I7 e" N; N, |
它不包含键ID,因为我想您可能会以某种方式对非空表ID和keyN列进行哈希处理以产生键的唯一ID。  U' q: C, B9 i, `6 P) j6 R* }
它还不包括唯一索引。为此,您需要采取UNION以下措施:
$ k$ [$ r! V4 N) u9 l* I6 ^SELECT - E8 F* }' |1 v) r% i* w) `9 Z
    t.name,
2 M( q$ `$ u% p$ K% D    'Unique',
1 O9 h* d) d2 q" Z1 e: }3 q    c.name
$ O. b+ I, O/ e+ x$ HFROM 9 ]2 a: h/ w) e1 w* p+ y
    sysobjects t INNER JOIN 8 t# U5 X1 U0 M9 g
    syscolumns c ON c.id = t.id INNER JOIN
1 m( e$ e% ]! i9 A: Q- @1 I$ [9 Q6 r    sysindexes i ON i.id = t.id1 f' ^" ?& {' Z( L  O& \1 r/ Q
WHERE t.type = 'U'
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则