Узнаем первичный ключ SQL Server таблицы с помощью T-SQL

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения столбцов, составляющих первичный ключ в таблице SQL Server, можно применить следующий T-SQL запрос:

SQL
Скопировать код
SELECT kcu.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
  ON tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
  AND tc.TABLE_NAME = kcu.TABLE_NAME
  AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
  AND tc.TABLE_NAME = 'ВашаТаблица';

Замените 'ВашаТаблица' на название нужной вам таблицы, чтобы получить перечень её столбцов, входящих в первичный ключ.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Значение первичного ключа

Определение и выделение первичного ключа крайне важно при работе с базами данных. Благодаря уникальным идентификаторам каждой записи, первичный ключ обеспечивает целостность данных и способствует оптимизации выполнения запросов. Этот элемент структуры таблицы необходим для поддержания порядка в данных.

Изучаем системные каталоги для определения первичного ключа

Изучение системных каталогов SQL Server позволяет получить более глубокое представление о структуре базы данных. Комбинирование представлений sys.indexes с другими системными объектами призвано упростить анализ индексов вашей базы данных:

SQL
Скопировать код
SELECT col.name
FROM sys.indexes idx
JOIN sys.index_columns idxCol ON idx.object_id = idxCol.object_id AND idx.index_id = idxCol.index_id
JOIN sys.columns col ON idx.object_id = col.object_id AND idxCol.column_id = col.column_id
WHERE idx.object_id = OBJECT_ID('ВашаТаблица') AND idx.is_primary_key = 1;

Выбор между двумя путями

Предложенные методы определения первичных ключей эффективны, однако следует учитывать их различия:

  • Запросы через INFORMATION_SCHEMA более стандартны и удобны для понимания.
  • Системные представления каталогов (sys.indexes и др.) содержат более детальную информацию, но требуют глубоких знаний о SQL Server.

Учёт схемы таблицы

Поскольку таблицы могут иметь одинаковые названия в различных схемах, при выгрузке данных необходимо указывать схему таблицы:

SQL
Скопировать код
SELECT kcu.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
  ON tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
  AND tc.TABLE_NAME = kcu.TABLE_NAME
  AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
  AND tc.TABLE_NAME = 'ВашаТаблица'
  AND tc.TABLE_SCHEMA = 'ВашаСхема';

Визуализация

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

Markdown
Скопировать код
🏛️ СТРУКТУРА АРКИ 🏛️

      /🔑\
     /     \
🏗️ ----- ----- 🏗️
  ||  ||   ||  ||  
  ||🏢||   ||🏬||

// 🔑 Первичный ключ в таблице подобен ключевому камню арки — оба элемента удерживают структуру целостной.
// Без них структура не устоит.

Поиск первичного ключа сопоставим с определением местоположения ключевого камня. Зная его, можно уверенно работать с данными в таблице.

Обработка составных ключей

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

SQL
Скопировать код
SELECT kcu.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
  ON tc.TABLE_NAME = kcu.TABLE_NAME
  AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
  AND tc.TABLE_NAME = 'ВашаТаблица'
ORDER BY kcu.ORDINAL_POSITION;

Особые случаи и их обработка

При анализе баз данных SQL могут встречаться особые ситуации, которые требуют индивидуального подхода:

  • Разделённые таблицы: В этих случаях важно учитывать разделение таблиц при представлении данных.
  • Индексы с фильтрацией: Если первичный ключ используется в индексах с фильтрацией, это влияет на логику запросов.
  • Отключенные индексы: Иногда индексы отключаются для обслуживания, но это не исключает их наличие в системе.
  • Системные версионные временные таблицы: Они документируют историю изменений и могут предъявлять особые требования к первичным ключам.

Полезные материалы

  1. sys.indexes (Transact-SQL) — SQL Server | Microsoft Learn
  2. sys.tables (Transact-SQL) — SQL Server | Microsoft Learn
  3. sys.columns (Transact-SQL) — SQL Server | Microsoft Learn
  4. sql — Как реализовать отношения один-к-одному, один-ко-многим и многие-ко-многим при проектировании таблиц? — Stack Overflow