2009-02-17 129 views

回答

2

我用下面的SQL与SQL Server 2005,以获得通过主键约束名称:

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 

要获取主键的表和字段由C onstraint名称:

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) 
0

这取决于你的DBMS,但是约束应该在目标表和列的地方。

如果是外键约束,目标表将与当前表不同。尝试

select * 

,而不是

select constraint_name 

看到所有你能一起工作的神奇列。

0
SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName 
    AND [email protected] 
    AND REFERENCED_COLUMN_NAME IS NOT NULL 
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”。“错误。

+0

我使用SQL Server 2005 – 2009-02-17 11:09:39

2

找到一个更好的解决方案here

代码下面添加的完整性,但都归功于皮纳尔戴夫

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 

添加此为一个额外的答案,因为它是从我以前的一个很远:)

0

我使用类似的东西。它也适用于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 

这一切都在系统表和视图,这是很好的记录。