识别Sybasetables, fields, keys, constraints
技术问答
480 人阅读
|
0 人回复
|
2023-09-14
|
正在尝试设置一个Sybase查询,该查询将为我提供以下输出:
9 {- F8 f: a8 W" [Table KeyType KeyNumber Column
3 D3 f6 W# W3 ^$ A8 B; V9 `table1 PK 1 table1_id
Q7 b9 V6 v; \2 e mtable1 FK 2 table2_id
# I; F2 I Q* W Xtable1 FK 3 table3_id% N2 {3 c N* _% ~5 a$ e1 W+ h
table1 FK 4 table4_id
5 ?6 a& v, a' x1 F' c+ }table1 Unique 5 table1_abc$ H+ R: X; g9 g. W7 U! i
table1 Unique 5 table1_def# o+ b8 x! E. b7 n5 \- B
* p1 I; d& c* p8 L+ t$ u8 S
换句话说,我需要每个表的PK,它具有的每个外键以及每个唯一键(不是一个键具有多个元素(例如上面的唯一键)的地方,是通过具有相同的PK来标识的。键号)。1 i; J% ?5 }( l. L2 y
我猜我需要使用sysobject,syscolumns,syskeys和sysconstraints,但我似乎无法弄清楚它们如何相互链接。; G7 ]! m. N& X, W/ Y1 @& x
6 m! O# U' d d5 E/ Y4 b& |
解决方案:
# L; K& b( i. j' U# J1 Y 6 c5 g$ W/ j9 c" E/ k3 E& l3 R
: Z+ Z; T4 k! k! A" x; p/ l) B+ g2 e0 O7 w! F X
这是一个开始:$ d* P0 Z" @ C2 i1 ~
SELECT
% a5 ]7 v- n A: U# d4 H t.name,
6 J3 t+ o5 N; k1 s- [5 o CASE k.type
; G1 [* ?5 y) N0 ?! W/ I; A WHEN 1 THEN 'PK'
' J6 ~0 \# K- e$ N! e4 | WHEN 2 THEN 'FK'
/ }9 \# ], D! Y0 w( A WHEN 3 THEN 'Common'
3 K# C* B( B7 Z; ~. i( N) c4 C END,3 b6 F- w0 Z$ ~* E. O) Y# D
c.name0 i! h7 o- }" Z9 x' r
FROM - L5 w8 q% f& p' U" h
sysobjects t INNER JOIN
3 z/ V1 C, S9 A. C; g) y, C9 s syscolumns c ON c.id = t.id INNER JOIN& H. |; y& B6 M& Q+ A9 K; e7 y
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)
& g( Y! C4 Q4 LWHERE 7 s- p+ e& m, U$ v
t.type = 'U' AND k.type in (1,2)! l* Q) ^7 K- R9 k( b
4 G \( I# Q- w! e它不包含键ID,因为我想您可能会以某种方式对非空表ID和keyN列进行哈希处理以产生键的唯一ID。
6 W$ q6 o: h5 H. x) z1 \& I它还不包括唯一索引。为此,您需要采取UNION以下措施:" A% Y9 i7 Z+ U! b5 O" K8 o5 U1 I
SELECT
; S" T3 f' d) F/ {9 M( T t.name,
4 U$ l% A+ M G4 C: y 'Unique',7 i/ k% ?& n1 A9 b" U! I
c.name
& t! A* K% {* A; \9 k9 G( xFROM : `0 O+ m0 S7 t/ s" H( Y
sysobjects t INNER JOIN
* P+ W6 F$ r X; Y, W. ]+ V syscolumns c ON c.id = t.id INNER JOIN
' b: s T. j1 v) R- h4 w/ o( O, F sysindexes i ON i.id = t.id
1 u$ U" q3 q5 x( O9 OWHERE t.type = 'U' |
|
|
|
|
|