use*_*039 4 database informix constraints
在编写大型事务(大量插入,删除,更新)并因此违反Informix中的约束(v10,但也应该适用于其他版本)时,我得到一个不太有用的消息,例如,我违反了约束r190_710.如何找出某个约束所涵盖的表和键,我只知道名称?
Tony Andrews建议(指向URL的不同终点):
从Informix指南到SQL:参考它应该看看系统目录表SYSCONSTRAINTS和SYSINDICES.
该手册中描述了Informix系统目录.
SysConstraints表是分析约束的起点,最肯定的是; 您在该表中找到约束名称,然后您可以从中找到其他详细信息.
但是,您还必须查看其他表,而不仅仅是(甚至直接)SysIndices.
例如,我对数据库中的表有很多NOT NULL约束.对于那些,约束类型是'N',并且不需要在别处寻找更多信息.
约束类型"P"表示主键; 需要通过SysIndexes视图或SysIndices表进行更多分析.类似地,约束类型"U"表示唯一约束,并且需要来自SysIndexes视图或SysIndices表的额外信息.
约束类型"C"表示检查约束; 约束的文本(和二进制编译形式)可以在SysChecks表中找到(数据类型为'T'和'B';数据或多或少用Base-64编码,但没有'='填充在最后并使用62和63的不同字符).
最后,约束类型"R"表示参照完整性约束.您可以使用SysReferences表来查找引用的表,并使用SysIndexes或SysIndices来确定使用引用表和引用表上的哪些索引,从中可以发现相关列.这可能会变得很毛茸茸!
小智 6
表中具有约束的列
SELECT
a.tabname, b.constrname, d.colname
FROM
systables a, sysconstraints b, sysindexes c, syscolumns d
WHERE
a.tabname = 'your_table_name_here'
AND
b.tabid = a.tabid
AND
c.idxname = b.idxname
AND
d.tabid = a.tabid
AND
(
d.colno = c.part1 or
d.colno = c.part2 or
d.colno = c.part3 or
d.colno = c.part4 or
d.colno = c.part5 or
d.colno = c.part6 or
d.colno = c.part7 or
d.colno = c.part8 or
d.colno = c.part9 or
d.colno = c.part10 or
d.colno = c.part11 or
d.colno = c.part12 or
d.colno = c.part13 or
d.colno = c.part14 or
d.colno = c.part15 or
d.colno = c.part16
)
ORDER BY
a.tabname,
b.constrname,
d.colname
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23751 次 |
| 最近记录: |