Поиск первичных ключей в 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)
Следующие шаги
- Теперь, когда у вас есть эти запросы, найдите время, чтобы определить, где могут отсутствовать первичные ключи
- Возьмите за правило всегда создавать первичный ключ для всех ваших таблиц.
- Если у вас нет подходящего кандидата на первичный ключ в вашей таблице, посмотрите на использование столбца идентификаторов именно для этой цели.