CONSTRAINT_NAMEは、主キーまたは外部キーであるかどうかはどのように知っていますか?

StackOverflow https://stackoverflow.com/questions/555622

質問

SQL Server 2005の上でこのSQLを使用して

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName

私は、主キーと外部キーを取得します。

どのようにして唯一の外部キーを得ることができますか? 制約は、主キーまたは外部キーであるかどうかはどのように見ることができますか?

おかげ

役に立ちましたか?

解決 2

私は主キーによって制約名を取得するために、SQL Server 2005のでは、次のSQLを使用します:

SELECT Constraint_Name 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
WHERE UNIQUE_CONSTRAINT_NAME = 
   (SELECT CONSTRAINT_NAME 
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
    WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)

Foreingキーによって制約名を取得するには:

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName

制約名で外部キーのテーブルとフィールドを取得するには:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = @ConstraintName

制約名で主キーのテーブルとフィールドを取得するには:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = 
    (SELECT UNIQUE_CONSTRAINT_NAME 
     FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
     WHERE CONSTRAINT_NAME = @ConstraintName)

他のヒント

はるかにエレガントなソリューション<のhref = "http://blog.sqlauthority.com/2007/09/04/sql-server-2005-find-tables-with-foreign-key-constraint-in-を発見ここを

データベース/」のrel = "nofollowをnoreferrer">

コードは、完全を期すために、以下の追加が、すべてのクレジットはPinalデイブ

に行きます
SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, 
   fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, 
   fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
LEFT JOIN sys.foreign_key_columns AS fc
   ON f.OBJECT_ID = fc.constraint_object_id

...あなただけの主キーが必要な場合
SELECT i.name AS IndexName,
        OBJECT_NAME(ic.OBJECT_ID) AS TableName,
        COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i
        INNER JOIN sys.index_columns AS ic
        ON i.OBJECT_ID = ic.OBJECT_ID 
    AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1
それはこれまでのところ、私の以前のものから削除されますので、

追加の答えとしてこれを追加しました:)

それはあなたのDBMSに依存しますが、制約がどこかにターゲット表と列を持っている必要があります。

これは、外部キー制約だ場合は、ターゲット表は、現在のテーブルに異なるだろう。試してみてください。

select *

の代わりに

select constraint_name

あなたがで作業することができ、すべての魔法の列を参照します。

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName
  AND REFERENCED_COLUMN_NAME IS NOT NULL

これは、ソリューションの最もエレガントではないのですが、あなたは何かなどを使用することができますので、MS SQL Serverは、キーのPK&FKプレフィックス命名規則を使用しています...

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'
それはあなたのDBMS

だ場合:)

編集

私は私が得たQuassnoiによって解答しようとしたとき、「無効な列名 『REFERENCED_COLUMN_NAME』を。」エラーます。

私はそのようなものを使用します。それだけでなく、SQL Server 2000で動作します。

select  object_name(fkx.constid) as fk_name,
        fkx.keyno as num,
        object_name(fkx.fkeyid) as child_table,
        col_name(fkx.fkeyid, fkx.fkey) as child_column,
        object_name(fkx.rkeyid) as parent_table,
        col_name(fkx.rkeyid, fkx.rkey) as parent_column
from sysforeignkeys fkx
order by fk_name, fkx.keyno

これはかなりよく文書化されているシステムテーブルとビューですべてです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top