Как выбрать столбцы первичного ключа из таблицы?
Мне нужно выбрать столбцы, которые являются первичным ключом, или столбец, который не является нулевым. Как я могу это сделать?
и мне нужны только столбцы, а не значения.
7 ответов
следующий ответ более уместен, я не уверен, как передать принятый ответ.
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<TABLE_NAME>' and IS_NULLABLE = 'NO'
чтобы перечислить столбцы первичного ключа, вы можете попробовать этот запрос:
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
надеюсь, что это помогает.
Список Столбцов Первичного Ключа
чтобы перечислить столбцы первичного ключа, я использовал реализацию SQL Server стандарта ANSI Представления Информационной Схемы поскольку с ними легче работать: нет необходимости использовать
вы можете использовать встроенное системное представление INFORMATION_KEY_COLUMN_USAGE для получения столбцов первичного ключа
SELECT [COLUMN_NAME]
FROM [DatabaseName].[INFORMATION_SCHEMA].[KEY_COLUMN_USAGE]
WHERE [TABLE_NAME] = 'TableName'
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<your_table>' and COLUMN_KEY = 'PRI'
этот пример протестирован на mariadb, mysql. Может работать на других, но зависит от деталей information_schema.
используя только 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
Я нашел решение самостоятельно в конце концов:
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')