2011-06-20 17 views
0

私は類似しているが同じではない3つの異なるSQL環境を持っています。私は別のテーブルで使用される列 "CLMID"を持っています。それらのほとんどは外部キーマッピングとリンクしています。しかし、いくつかのテーブルが壊れているので、外部キーマッピングが正しく行われていません。私は今、すべてのテーブルのこの列にデータを更新する必要があります。だから、適切なマッピングを持っているテーブルのリストを私に見つけ出すクエリが必要です。そのため、親を更新すると、それらの子によってそれらを更新します。私はまた、私が親テーブルを更新することができる子を更新する場合にのみ、他の方法で制約を見つける必要があります。外部キーをトレースする方法は?

重要なデータベースとして、更新や挿入操作を行わずにこのリストを取得する必要があります。クエリで私を助けてください。ありがとうございました。

答えて

2

すべてのSQL製品は、キーを含むスキーマデータをデータベースに照会する何らかの方法を持っています。 Information_Schemaを使用することを学ぶことは、ほとんどのプラットフォームで標準であるため(IMがそれを実装していないことを思い出しています)、IMHOが最適です。

SQL Serverにはおそらくカタログが付いた簡単なクエリがいくつかありますが、次のやや毛深いクエリは、あなたが望むものを正確に提供し、入手できる最もクロスプラットフォームです。

SELECT 
    FK.TABLE_NAME as child_table, 
    CU.COLUMN_NAME as child_column, 
    PK.TABLE_NAME as parent_table, 
    PT.COLUMN_NAME as parent_column, 
    C.CONSTRAINT_NAME 
FROM 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
    ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
    ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
    ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN 
( 
    SELECT 
     i1.TABLE_NAME, i2.COLUMN_NAME 
    FROM 
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
     INNER JOIN 
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
     ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
     WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) PT 
ON PT.TABLE_NAME = PK.TABLE_NAME 
ORDER BY 
1,2,3,4 
+0

ありがとうございます。これは役に立ちました。 – Vinodtiru

0

はこれを見したら、この

show create table table-name 

を試してみてください、あなたは列が持っている外部キーを見ることができます。これはテーブルのデータを変更しません

0

SQL Server固有のアクションについては、sys.foreign_keysを参照してください。具体的には、delete_referential_action_desc列とupdate_referential_action_desc列に興味があるようです。私が知る限り、子テーブルを更新し、更新プログラムを親に自動的に伝播させる方法はありません。私は訂正しても構わない。

関連する問題