如何从表中选择主键列?

时间:2011-03-01 10:15:57

标签: sql sql-server-2008

我需要选择作为主键的列或非空的列。我怎么能这样做?

我只想要列,而不是值。

7 个答案:

答案 0 :(得分:12)

要列出主键列,您可以尝试以下查询:

SELECT
    kc.name,
    c.NAME
FROM 
    sys.key_constraints kc
INNER JOIN 
    sys.index_columns ic ON kc.parent_object_id = ic.object_id  and kc.unique_index_id = ic.index_id
INNER JOIN 
    sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE
    kc.type = 'PK'

并列出外键,请使用以下命令:

SELECT
    OBJECT_NAME(parent_object_id) 'Parent table',
    c.NAME 'Parent column name',
    OBJECT_NAME(referenced_object_id) 'Referenced table',
    cref.NAME 'Referenced column name'
FROM 
    sys.foreign_key_columns fkc
INNER JOIN 
    sys.columns c 
       ON fkc.parent_column_id = c.column_id 
          AND fkc.parent_object_id = c.object_id
INNER JOIN 
    sys.columns cref 
       ON fkc.referenced_column_id = cref.column_id 
          AND fkc.referenced_object_id = cref.object_id

希望这有帮助。

答案 1 :(得分:3)

下一个答案更为恰当,我不知道如何转移已接受的答案。

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS  
WHERE TABLE_NAME = '<TABLE_NAME>' and IS_NULLABLE = 'NO'

答案 2 :(得分:2)

列出主键列

要列出主键列,我使用了SQL Server的ANSI标准Information Schema Views实现,因为它们更容易使用:不需要使用object_name()函数来翻译{{1人类可读的名字。

我使用object_id列出 对表的约束 - 主键和外键; [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE]有类似的信息,但是 缺少[INFORMATION_SCHEMA].CONSTRAINT_COLUMN_USAGE

ORDINAL_POSITION提供有关的更多信息 约束(最重要的是[INFORMATION_SCHEMA].[TABLE_CONSTRAINTS])但不列出约束适用的列。

要获取主键使用的唯一列列表,请加入上面的列 使用约束名称的两个表:

CONSTRAINT_TYPE

答案 3 :(得分:1)

您可以使用名为INFORMATION_KEY_COLUMN_USAGE的内置系统视图来获取主键列

SELECT [COLUMN_NAME]
FROM [DatabaseName].[INFORMATION_SCHEMA].[KEY_COLUMN_USAGE]
WHERE [TABLE_NAME] = 'TableName'

答案 4 :(得分:1)

EOF

这个例子是在mariadb,mysql上测试的。 可能会对其他人工作,但取决于information_schema的详细信息。

答案 5 :(得分:0)

仅使用sys.*表:

select
    t.name,
    kc.type,
    kc.name,
    c.name,
    i.is_unique,
    i.is_primary_key,
    i.is_unique_constraint,
    ic.is_descending_key,
    ic.key_ordinal,
    ic.is_included_column
from sys.key_constraints kc
inner join sys.objects t on t.object_id = kc.parent_object_id
inner join sys.indexes i on i.name = kc.name
inner join sys.index_columns ic on ic.object_id = kc.parent_object_id and ic.index_id = i.index_id
inner join sys.columns c on c.object_id = kc.parent_object_id and c.column_id = ic.column_id
order by
    t.name,
    kc.type,
    kc.name,
    ic.key_ordinal

答案 6 :(得分:0)

毕竟我自己找到了一个解决方案:

select sc.name from sys.objects as so
inner join sys.indexes as si        on so.object_id = si.object_id 
                                    and si.is_primary_key = 1
inner join sys.index_columns as ic  on si.object_id = ic.object_id
                                    and si.index_id = ic.index_id
inner join sys.columns as sc            on so.object_id = sc.object_id
                                    and ic.column_id = sc.column_id
where so.object_id = object_id('TABLE_NAME')