我需要输出给定表的约束信息。我在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
我需要在相关表格(在此情况下为“人员”)中列出所有关键约束(主要,外在-任何)。
答案 0 :(得分:0)
使用架构视图INFORMATION_SCHEMA.TABLE_CONSTRAINTS
和INFORMATION_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的工具可能会有用。