识别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' |
|
|
|
|
|