如何在SQL Server中获取表约束信息

时间:2019-01-08 15:37:04

标签: tsql sql-server-2008 constraints

我需要输出给定表的约束信息。我在SO上找到了许多密切相关的信息,但没有找到一些特定的信息。

我需要输出在查询结果中看起来像这样:

CONSTRAINT_NAME CONSTRAINT_TYPE COLUMN_NAME REFERENCED_TABLE REFERENCED_COLUMN

当前,我有以下查询:

SELECT
obj_Constraint.NAME AS CONSTRAINT_NAME,
obj_Constraint.type_desc AS CONSTRAINT_TYPE,
'' AS COLUMN_NAME,
'' AS REFERENCED_TABLE,
columns.NAME AS REFERENCED_COLUMN
FROM sys.objects AS obj_table 
LEFT JOIN sys.objects AS obj_Constraint ON obj_table.object_id = obj_Constraint.parent_object_id 
LEFT JOIN sys.sysconstraints AS constraints ON constraints.constid = obj_Constraint.object_id 
LEFT JOIN sys.columns AS columns ON columns.object_id = obj_table.object_id AND columns.column_id = constraints.colid 
WHERE obj_table.name = 'some_table'
ORDER BY obj_Constraint.type_desc

我从哪里获得引用的(外键)表和列信息?

(我需要与SQL Server 2008及更高版本兼容的查询)

编辑

根据最初的回答,我可能不清楚所需的输出。

说我有一个表“ people”,其中有“ poepleID”,“ name”,“ city”,“ stateID”列。主键在poepleID列上。我也有一个带有“ stateID”和“ state”的表“ states”。主键位于stateID列上。您可以猜得出我对people.stateID有一个外键约束。我称它为FK__people__states__stateID

所以我需要一个查询来输出以下内容:

CONSTRAINT_NAME                 CONSTRAINT_TYPE            COLUMN_NAME     REFERENCED_TABLE     REFERENCED_COLUMN
PK__people                      PRIMARY_KEY_CONSTRAINT     peopleID              
FK__people__states__stateID     FOREIGN_KEY_CONSTRAINT     stateID         states               stateID

我需要在相关表格(在此情况下为“人员”)中列出所有关键约束(主要,外在-任何)。

2 个答案:

答案 0 :(得分:0)

使用架构视图INFORMATION_SCHEMA.TABLE_CONSTRAINTSINFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

此查询显示所有外键,例如:

SELECT
    ConstraintName = C.CONSTRAINT_NAME,
    PrimaryKeyTable = QUOTENAME(PK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(PK.TABLE_NAME),
    PrimaryKeyColumn = CCU.COLUMN_NAME,
    ForeignKeyTable = QUOTENAME(FK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME),
    ForeignKeyColumn = CU.COLUMN_NAME,
    UpdateRule = C.UPDATE_RULE,
    DeleteRule = C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON 
        C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON 
        C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME AND
        C.UNIQUE_CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG AND
        C.UNIQUE_CONSTRAINT_SCHEMA = PK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON 
        C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = CU.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = CU.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON 
        PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME AND
        PK.CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG AND
        PK.CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA
WHERE
    FK.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY
    PK.TABLE_NAME, 
    FK.TABLE_NAME

我相信您可以解决此问题,从而在单个查询中获得所需的结果。


示例:

CREATE TABLE PKTable (
    PKColumn INT PRIMARY KEY,
    CheckValue INT,
    CHECK (CheckValue > 0))

CREATE TABLE FKTable (
    FKColumn INT, 
    FOREIGN KEY (FKColumn) REFERENCES PKTable (PKColumn))


DECLARE @TableName VARCHAR(100) = 'PKTable'

-- Primary keys, checks
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS T WHERE T.TABLE_NAME = @TableName

-- Foreign keys
SELECT
    ConstraintName = C.CONSTRAINT_NAME,
    PrimaryKeyTable = QUOTENAME(PK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(PK.TABLE_NAME),
    PrimaryKeyColumn = CCU.COLUMN_NAME,
    ForeignKeyTable = QUOTENAME(FK.CONSTRAINT_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME),
    ForeignKeyColumn = CU.COLUMN_NAME,
    UpdateRule = C.UPDATE_RULE,
    DeleteRule = C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON 
        C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON 
        C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME AND
        C.UNIQUE_CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG AND
        C.UNIQUE_CONSTRAINT_SCHEMA = PK.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON 
        C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME AND
        C.CONSTRAINT_CATALOG = CU.CONSTRAINT_CATALOG AND
        C.CONSTRAINT_SCHEMA = CU.CONSTRAINT_SCHEMA
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON 
        PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME AND
        PK.CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG AND
        PK.CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA
WHERE
    FK.CONSTRAINT_TYPE = 'FOREIGN KEY' AND
    PK.TABLE_NAME = @TableName
ORDER BY
    PK.TABLE_NAME, 
    FK.TABLE_NAME

结果:

CONSTRAINT_CATALOG  CONSTRAINT_SCHEMA   CONSTRAINT_NAME                 TABLE_CATALOG   TABLE_SCHEMA    TABLE_NAME  CONSTRAINT_TYPE     IS_DEFERRABLE   INITIALLY_DEFERRED
RS1                 dbo                 PK__PKTable__1EEFCD814EF90F36   RS1             dbo             PKTable     PRIMARY KEY         NO              NO
RS1                 dbo                 CK__PKTable__CheckVa__6DBA0403  RS1             dbo             PKTable     CHECK               NO              NO


ConstraintName                  PrimaryKeyTable     PrimaryKeyColumn    ForeignKeyTable     ForeignKeyColumn    UpdateRule  DeleteRule
FK__FKTable__FKColum__6FA24C75  [dbo].[PKTable]     PKColumn            [dbo].[FKTable]     FKColumn            NO ACTION   NO ACTION

答案 1 :(得分:0)

我认为您可以使用col_names = ['pressure', 'height', 'temperature', 'dewpoint', 'direction', 'speed'] pd.read_fwf('addbna.txt', usecols=[0, 1, 2, 3, 6, 7], names=col_names) 并检查this post来获取代码。 还有一个名为Advanced SQL Server Dependencies的工具可能会有用。