3

この SQL を SQL Server 2005 で使用する

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

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

外部キーのみを取得するにはどうすればよいですか? 制約が主キーか外部キーかを確認するにはどうすればよいですか?

ありがとう

4

6 に答える 6

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 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)
于 2009-03-23T17:10:02.613 に答える
2

ここではるかにエレガントなソリューションを見つけました

完全を期すためにコードを以下に追加しますが、すべてのクレジットは 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

これは、以前の回答からはるかに削除されているため、追加の回答として追加しました:)

于 2009-02-17T11:52:18.307 に答える
0

私はそのようなものを使います。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

それはすべてシステムテーブルとビューにあり、かなりよく文書化されています。

于 2009-02-24T10:04:47.357 に答える
0
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName
  AND REFERENCED_COLUMN_NAME IS NOT NULL
于 2009-02-17T10:27:50.413 に答える
0

これは最も洗練されたソリューションではありませんが、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'」が表示されました。エラー。

于 2009-02-17T10:38:33.993 に答える
0

DBMS によって異なりますが、制約には対象のテーブルと列がどこかにある必要があります。

外部キー制約の場合、ターゲット テーブルは現在のテーブルとは異なります。試す

select *

それ以外の

select constraint_name

操作できる魔法の列をすべて表示します。

于 2009-02-17T05:43:33.873 に答える