【问题标题】:How do I know if CONSTRAINT_NAME is a Primary or Foreign Key?我如何知道 CONSTRAINT_NAME 是主键还是外键?
【发布时间】:2010-10-08 00:34:40
【问题描述】:

在 SQL Server 2005 上使用此 SQL

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

我得到主键和外键。

我怎样才能只获得外键? 如何查看约束是主键还是外键?

谢谢

【问题讨论】:

    标签: sql sql-server metadata constraints table-structure


    【解决方案1】:

    这取决于您的 DBMS,但约束应该在某处具有目标表和列。

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

    select *
    

    而不是

    select constraint_name
    

    查看您可以使用的所有神奇列。

    【讨论】:

      【解决方案2】:
      SELECT CONSTRAINT_NAME
      FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
      WHERE TABLE_NAME = @TableName
        AND COLUMN_NAME=@ColumnName
        AND REFERENCED_COLUMN_NAME IS NOT NULL
      

      【讨论】:

        【解决方案3】:

        这不是最优雅的解决方案,但 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'”。错误。

        【讨论】:

        • 是的,我也是 SQL Server 2005 使用上述约定
        【解决方案4】:

        找到了一个更优雅的解决方案here

        为了完整起见,在下面添加了代码,但所有功劳归于 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
        

        将此作为附加答案添加,因为它与我之前的答案相去甚远:)

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            我在 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)
            

            通过外键获取约束名称:

            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)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-24
              • 1970-01-01
              • 1970-01-01
              • 2014-11-24
              • 1970-01-01
              • 2018-08-20
              相关资源
              最近更新 更多