【发布时间】:2017-01-04 15:40:39
【问题描述】:
我需要检查一列是否是候选键。为了使其通用,我创建了一个存储过程:
ALTER PROCEDURE [dbo].[CheckPK]
(
@tableName VARCHAR(100),
@pk VARCHAR(100)
)
AS
PRINT 'Checking for candidate key ' + @pk + ' for table: ' + @tableName
DECLARE @sql NVARCHAR(4000)
SET @sql = 'select count(distinct ([' + @pk + '])) as tot_pk from ' + @tableName + ' select count (*) as tot_real from ' + @tableName
EXEC sp_executesql @sql
效果很好。我要做的是验证两个选定的值是否相同。
问题:是否可以添加if(tot_pk = tot_real) 类型的条件?
我是 SQL 的新手,所以如果这个问题看起来微不足道,我深表歉意。谢谢
【问题讨论】:
-
所以你想知道一个特定的列是否只有 unique 值,对吗?因为您可以查看
sys架构中的主键和约束定义 -
select count(distinct pk)将始终返回与select count(*)相同的结果。这是因为 pk 根据定义是唯一且不可为空的,这意味着表中的每条记录都将具有唯一值,因为它是主键。 -
@ZoharPeled 我需要验证 pk 实际上是主键。
-
您实际上要做的是确定单个列是否是“候选”键。
-
我在您的帖子中更改了它(人们因为您似乎误用了“主键”一词而对您投了反对票)。
标签: sql sql-server tsql