Поиск первичных ключей в SQL Server

Tags: SQL Server

Проблема

Одним из аспектов разработки, который должны быть у всех таблиц, является первичный ключ. Первичный ключ - это основной путь входа в ваш набор данных, поэтому при доступе к вашим данным вы гарантированно затронете только одну строку данных. Наличие первичных ключей является не только хорошей особенностью проектирования, но и играет важную роль в репликации и обновлении данных, особенно когда могут быть дублированные строки данных. Так как же определить, какие таблицы имеют первичные ключи, а какие таблицы нет?

Решение

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

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

Были и другие советы, которые фокусируются на всех индексах, существующих в базе данных, но здесь мы по-другому взглянем на таблицы с первичными ключами и таблицы без первичных ключей. Для SQL 2005 и более поздних версий это довольно легко сделать с помощью представлений каталога sys.key_constraints, но в SQL 2000 получение этой информации немного загадочно.

Найдите все таблицы SQL Server в базе данных с первичным ключом

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

SQL Server 2005 / 2008 / 2008 R2 / 2012 / 2014 / 2016 / 2017

SELECT 

   c.name as SchemaName, 

   b.name as TableName, 

   a.name as PKname

FROM sys.key_constraints a 

INNER JOIN sys.tables b ON a.parent_object_id = b.OBJECT_ID 

INNER JOIN sys.schemas c ON a.schema_id = c.schema_id 

WHERE a.type = 'PK'

SQL Server 2000

SELECT c.name, a.name, b.name

FROM sysobjects a

INNER JOIN sysindexes b ON a.id = b.id

INNER JOIN sysusers c ON a.uid = c.uid

WHERE (b.status & 2048)<>0

Найдите все таблицы SQL Server в базе данных без первичного ключа

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

SQL Server 2005 / 2008 / 2008 R2 / 2012 / 2014 / 2016 / 2017

SELECT 

   c.name as SchemaName, 

   b.name as TableName

FROM sys.tables b 

INNER JOIN sys.schemas c ON b.schema_id = c.schema_id 

WHERE b.type = 'U' 

AND NOT EXISTS (SELECT a.name 

                FROM sys.key_constraints a 

                WHERE a.parent_object_id = b.OBJECT_ID 

                AND a.schema_id = c.schema_id 

                AND a.type = 'PK' )

SQL Server 2000

SELECT c.name, a.name

FROM sysobjects a

INNER JOIN sysusers c ON a.uid = c.uid

WHERE xtype = 'U'

AND NOT EXISTS (SELECT b.name

FROM sysindexes b

WHERE a.id = b.id

AND (b.status & 2048)<>0)

Следующие шаги

  1. Теперь, когда у вас есть эти запросы, найдите время, чтобы определить, где могут отсутствовать первичные ключи
  2. Возьмите за правило всегда создавать первичный ключ для всех ваших таблиц.
  3. Если у вас нет подходящего кандидата на первичный ключ в вашей таблице, посмотрите на использование столбца идентификаторов именно для этой цели.

No Comments

Add a Comment