Как выбрать столбцы первичного ключа из таблицы? - PullRequest
6 голосов
/ 01 марта 2011

Мне нужно выбрать столбцы, которые являются первичным ключом, или столбец, который не является нулевым.Как я могу это сделать?

И мне нужны только столбцы, а не значения.

Ответы [ 7 ]

12 голосов
/ 01 марта 2011

Чтобы вывести список столбцов первичного ключа, вы можете попробовать этот запрос:

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

Надеюсь, это поможет.

3 голосов
/ 01 марта 2011

Следующий ответ более уместен, я не уверен, как передать принятый ответ.

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS  
WHERE TABLE_NAME = '<TABLE_NAME>' and IS_NULLABLE = 'NO'
2 голосов
/ 06 августа 2014

Список первичных ключевых столбцов

Чтобы перечислить столбцы первичного ключа, я использовал реализацию SQL Server стандарта ANSI Представления информационной схемы , поскольку с ними проще работать: нет необходимости использовать функцию object_name() для перевода object_id с понятными человеку именами.

Я использую [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE], чтобы перечислить ограничения на таблицу - как первичные, так и внешние ключи; [INFORMATION_SCHEMA].CONSTRAINT_COLUMN_USAGE имеет похожую информацию, но не хватает ORDINAL_POSITION.

[INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] предоставляет дополнительную информацию о ограничения (наиболее важно CONSTRAINT_TYPE), но не перечисляются столбцы, к которым применяется ограничение.

Чтобы получить единственный список столбцов, используемых первичным ключом, присоединитесь к приведенному выше. две таблицы, использующие имя ограничения:

SELECT
     tc.TABLE_SCHEMA
    ,tc.TABLE_NAME
    ,tc.CONSTRAINT_NAME
    ,kcu.COLUMN_NAME
    ,kcu.ORDINAL_POSITION
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu
    ON kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME

WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND tc.TABLE_NAME = @TableName
1 голос
/ 11 июня 2017
SELECT * FROM INFORMATION_SCHEMA.COLUMNS  
WHERE TABLE_NAME = '<your_table>' and COLUMN_KEY = 'PRI'

этот пример протестирован на mariadb, mysql. Может работать на других, но зависит от деталей information_schema.

1 голос
/ 01 марта 2011

Вы можете использовать встроенное системное представление INFORMATION_KEY_COLUMN_USAGE, чтобы получить столбцы первичного ключа

SELECT [COLUMN_NAME]
FROM [DatabaseName].[INFORMATION_SCHEMA].[KEY_COLUMN_USAGE]
WHERE [TABLE_NAME] = 'TableName'
0 голосов
/ 03 мая 2017

Я все-таки нашел решение:

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')
0 голосов
/ 08 июля 2016

с использованием только таблиц 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...