6

大規模なトランザクション(多くの挿入、削除、更新)をプログラミングし、それによってInformix(v10、ただし他のバージョンにも適用する必要があります)の制約に違反すると、たとえば、制約r190_710に違反したというあまり役に立たないメッセージが表示されます。名前しかわからない特定の制約の対象となるテーブルとキーを確認するにはどうすればよいですか?

4

7 に答える 7

8

Tony Andrews が提案した (URL の別のエンドポイントを指している):

Informix Guide to SQL: Referenceから、システム カタログ テーブル 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 を使用して、参照テーブルと参照テーブルのどのインデックスが使用されているかを確立し、そこから関連する列を検出できます。これは非常に毛むくじゃらになる可能性があります。

于 2008-11-28T21:30:46.830 に答える
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
于 2012-06-08T12:07:12.170 に答える
3

次のクエリを使用して、さまざまな種類の制約に関する詳細情報を取得しています。これは、システム テーブルの詳細とシステム カタログに関するいくつかの説明に基づいています。

sysconstraints.constrtype は、制約のタイプを示します。

  • P = 主キー
  • U = 固有キー / 代替キー
  • N = null ではない
  • C = チェック
  • R = 参照 / 外部キー
select
  tab.tabname,
  constr.*, 
  chk.*,
  c1.colname col1,
  c2.colname col2,
  c3.colname col3,
  c4.colname col4,
  c5.colname col5
from sysconstraints constr
  join systables tab on tab.tabid = constr.tabid
  left outer join syschecks chk on chk.constrid = constr.constrid and chk.type = 'T'
  left outer join sysindexes i on i.idxname = constr.idxname
  left outer join syscolumns c1 on c1.tabid = tab.tabid and c1.colno = abs(i.part1)
  left outer join syscolumns c2 on c2.tabid = tab.tabid and c2.colno = abs(i.part2)
  left outer join syscolumns c3 on c3.tabid = tab.tabid and c3.colno = abs(i.part3)
  left outer join syscolumns c4 on c4.tabid = tab.tabid and c4.colno = abs(i.part4)
  left outer join syscolumns c5 on c5.tabid = tab.tabid and c5.colno = abs(i.part5)
where constr.constrname = 'your constraint name'
于 2016-10-27T10:57:24.290 に答える
0

Informix Guide to SQL: Referenceから、システム カタログ テーブル SYSCONSTRAINTS および SYSINDICES を調べる必要があるようです。

于 2008-11-26T16:00:46.650 に答える
0

制約の名前がconstraint_c6である場合、その定義をダンプする方法は次のとおりです (行は空白で区切られるため、行を連結する必要があります)。

OUTPUT TO '/tmp/constraint_c6.sql' WITHOUT HEADINGS
SELECT ch.checktext
FROM  syschecks ch, sysconstraints co
WHERE ch.constrid = co.constrid
  AND ch.type = 'T' -- text lines only
  AND co.constrname = 'constraint_c6' 
ORDER BY ch.seqno;
于 2015-12-09T12:27:54.270 に答える
0

www.iiug.org (International Informix Users Group) でのサーフィンから、それほど簡単ではない解決策を見つけました。

(1) 制約名から参照制約データを取得します (「AND sc.constrname = ?」を「AND st.tabname MATCHES ?」に置き換えることで、テーブルのすべての制約を取得できます)。このステートメントは、他の状況で興味深い可能性があるため、ここで必要以上にいくつかのフィールドを選択します。

SELECT si.part1, si.part2, si.part3, si.part4, si.part5, 
    si.part6, si.part7, si.part8, si.part9, si.part10, 
    si.part11, si.part12, si.part13, si.part14, si.part15, si.part16, 
    st.tabname, rt.tabname as reftable, sr.primary as primconstr, 
    sr.delrule, sc.constrid, sc.constrname, sc.constrtype, 
    si.idxname, si.tabid as tabid, rc.tabid as rtabid 
FROM 'informix'.systables st, 'informix'.sysconstraints sc, 
     'informix'.sysindexes si, 'informix'.sysreferences sr, 
     'informix'.systables rt, 'informix'.sysconstraints rc 
WHERE st.tabid = sc.tabid 
  AND st.tabtype != 'Q' 
  AND st.tabname NOT MATCHES 'cdr_deltab_[0-9][0-9][0-9][0-9][0-9][0-9]*' 
  AND rt.tabid = sr.ptabid 
  AND rc.tabid = sr.ptabid
  AND sc.constrid = sr.constrid 
  AND sc.tabid = si.tabid 
  AND sc.idxname = si.idxname 
  AND sc.constrtype = 'R' 
  AND sc.constrname = ?
  AND sr.primary = rc.constrid 
ORDER BY si.tabid, sc.constrname

(2) part1-part16 を使用して、制約の影響を受ける列を判別します。0 以外の値を含む part[n] には、使用される列の列番号が含まれます。(3) を使用して、列の名前を見つけます。

constrtype が 'R' (参照) の場合、次のステートメントを使用して、参照テーブルの部分を見つけます。

SELECT part1, part2, part3, part4, part5, part6, part7, part8, 
    part9, part10, part11, part12, part13, part14, part15, part16 
FROM 'informix'.sysindexes si, 'informix'.sysconstraints sc 
WHERE si.tabid = sc.tabid 
AND si.idxname = sc.idxname 
AND sc.constrid = ? -- primconstr from (1)

(3) (1) の tabid と rtabid (制約を参照するため) を使用して、次のようなテーブルの列を取得できるようになりました。

SELECT colno, colname 
FROM 'informix'.syscolumns 
WHERE tabid = ? -- tabid(for referenced) or rtabid(for referencing) from (1)
  AND colno = ? -- via parts from (1) and (2)
ORDER BY colno

(4) constrtype が「C」の場合、次のようなチェック情報を取得します。

SELECT type, seqno, checktext
FROM 'informix'.syschecks
WHERE constrid = ? -- constrid from (1)

確かにかなり毛むくじゃら

于 2008-12-03T15:52:05.123 に答える