Определение первичного ключа таблицы с использованием T-SQL
Я пытаюсь определить первичный ключ таблицы с использованием TSQL (подходит как хранимая процедура, так и системная таблица). Существует ли такой механизм в SQL Server (2005 или 2008)?
5 ответ(ов)
Вот пример запроса, который поможет вам начать:
SELECT
*
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE
tc.TABLE_NAME = 'TableName' AND
tc.CONSTRAINT_TYPE = 'Primary Key'
Этот запрос извлекает информацию о первичных ключах для таблицы с указанным именем. Он соединяет две схемы: TABLE_CONSTRAINTS
, чтобы получить типы ограничений, и CONSTRAINT_COLUMN_USAGE
, чтобы узнать, какие столбцы участвуют в этих ограничениях. Не забудьте заменить 'TableName'
на имя вашей таблицы.
Использование системы хранимых процедур SQL Server может помочь получить информацию о первичных ключах для заданной таблицы. Вы можете использовать следующий запрос:
EXEC sp_pkeys 'TableName'
В этом запросе нужно заменить 'TableName'
на имя вашей таблицы. Процедура вернет набор данных, содержащий информацию о первичных ключах, включая имя таблицы, имя столбца ключа и порядок столбцов, если ключ состоит из нескольких столбцов.
Обратите внимание, что данный метод работает только в SQL Server, и если вы используете другую СУБД, вам может понадобиться другой подход.
Вот решение, основанное на системных таблицах из SQL Server 2005 (на 99% уверенно, что будет работать и в 2008). Этот запрос перечисляет все первичные ключи для всех таблиц, определенных пользователем, с указанием всех колонок и некоторой дополнительной информацией, которую можно удалить. Вы можете добавить параметры, чтобы выбрать конкретную таблицу.
SELECT
schema_name(ta.schema_id) AS SchemaName,
ta.name AS TableName,
ind.name AS IndexName,
indcol.key_ordinal AS Ordinal,
col.name AS ColumnName,
ind.type_desc AS IndexType,
ind.fill_factor AS FillFactor
FROM sys.tables ta
INNER JOIN sys.indexes ind
ON ind.object_id = ta.object_id
INNER JOIN sys.index_columns indcol
ON indcol.object_id = ta.object_id
AND indcol.index_id = ind.index_id
INNER JOIN sys.columns col
ON col.object_id = ta.object_id
AND col.column_id = indcol.column_id
WHERE ind.is_primary_key = 1
ORDER BY
ta.name,
indcol.key_ordinal;
Этот запрос вернет название схемы и таблицы, имя индекса, порядковый номер колонки, имя колонки, тип индекса и фактор заполнения для всех первичных ключей. Чтобы отфильтровать результаты по конкретной таблице, вы можете добавить условие в WHERE
для фильтрации по ta.name
. Например:
WHERE ind.is_primary_key = 1 AND ta.name = 'ИмяВашейТаблицы'
Таким образом, вы сможете получить информацию только по интересующей вас таблице.
Ваш SQL-запрос предназначен для извлечения имен столбцов и имен ограничений первичного ключа из определенной таблицы в базе данных. Вот перевод вашего запроса с объяснениями на русском:
SELECT ccu.COLUMN_NAME, ccu.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu
ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME
WHERE tc.TABLE_CATALOG = 'Your_Catalog' -- замените на ваш каталог
AND tc.TABLE_SCHEMA = 'dbo' -- замените на вашу схему
AND tc.TABLE_NAME = 'Your_Table' -- замените на имя вашей таблицы
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
Этот запрос выполняет следующие действия:
- Извлекает имена столбцов (
COLUMN_NAME
) и имена ограничений (CONSTRAINT_NAME
), которые связаны с первичным ключом таблицы. - Использует объединение (
INNER JOIN
) междуINFORMATION_SCHEMA.TABLE_CONSTRAINTS
иINFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
, чтобы связать ограничения с их соответствующими столбцами. - Ограничивает результаты по каталогу, схеме и названию таблицы, которые вы должны заменить на свои собственные значения.
Убедитесь, что вы подставили актуальные имена для ваших параметров: Your_Catalog
, dbo
(или другую схему) и Your_Table
, чтобы запрос вернул нужные данные.
Чтобы выполнить запрос на получение первичных ключей для определенной таблицы в SQL Server, вы можете использовать следующую команду:
EXEC [sys].[sp_primary_keys_rowset] @table_name = 'TableName';
Здесь 'TableName'
следует заменить на имя вашей таблицы. Данная команда возвращает информацию о первичных ключах, связанных с указанной таблицей, включая имя ключа, имя столбца и его порядок. Убедитесь, что у вас есть необходимые права доступа для выполнения этой команды.
"Вставка результатов хранимой процедуры в временную таблицу"
Как экранировать одинарную кавычку в SQL Server?
Как выполнить оператор UPDATE с JOIN в SQL Server?
Возможно ли задать условия в Count()?
Создание хранимой процедуры, если она еще не существует