この SQL を SQL Server 2005 で使用する
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
主キーと外部キーを取得します。
外部キーのみを取得するにはどうすればよいですか? 制約が主キーか外部キーかを確認するにはどうすればよいですか?
ありがとう
この SQL を SQL Server 2005 で使用する
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
主キーと外部キーを取得します。
外部キーのみを取得するにはどうすればよいですか? 制約が主キーか外部キーかを確認するにはどうすればよいですか?
ありがとう
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 Key で制約名を取得するには:
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)
ここではるかにエレガントなソリューションを見つけました
完全を期すためにコードを以下に追加しますが、すべてのクレジットは Pinal Dave に帰属します
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
これは、以前の回答からはるかに削除されているため、追加の回答として追加しました:)
私はそのようなものを使います。SQLServer2000でも機能します。
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
それはすべてシステムテーブルとビューにあり、かなりよく文書化されています。
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'」が表示されました。エラー。
DBMS によって異なりますが、制約には対象のテーブルと列がどこかにある必要があります。
外部キー制約の場合、ターゲット テーブルは現在のテーブルとは異なります。試す
select *
それ以外の
select constraint_name
操作できる魔法の列をすべて表示します。