如何确定表是否具有一些唯一列

zma*_*ter 11 sql sql-server unique

我使用的是MS SQL Server.

我已经交了一些没有约束的大桌子,没有钥匙也没有.

我知道有些列具有唯一值.对于给定的表,是否有一种聪明的方法来查找具有唯一值的cols?

现在,我通过计算是否存在与表中的行一样多的DISTINCT值来手动为每列执行此操作.

SELECT COUNT(DISTINCT col) FROM table
Run Code Online (Sandbox Code Playgroud)

可能会让一个cusor循环遍历所有列,但想知道是否有人知道更聪明或内置函数.

谢谢.

And*_*y M 8

这是一种基本类似于@JNK的方法,但它不是打印计数,而是为每个列返回一个现成的答案,告诉您列是否仅包含唯一值:

DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';

SELECT
  @sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
  SELECT
    ColumnExpression =
      'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
      'WHEN COUNT(*) THEN ''UNIQUE'' ' +
      'ELSE '''' ' +
      'END AS ' + COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = @table
) s

SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql;  /* in case you want to have a look at the resulting query */
EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)

它只是COUNT(DISTINCT column)COUNT(*)每列相比较.结果将是一个包含单行的表,其中每列将包含UNIQUE那些没有重复项的列的值,如果存在重复项则为空字符串.

但上述解决方案仅适用于那些没有NULL的列.应该注意,当您要在列上创建唯一约束/索引时,SQL Server不会忽略NULL.如果一列只包含一个NULL且所有其他值都是唯一的,您仍然可以在列上创建一个唯一约束(但不能使它成为主键,这需要值的唯一性和缺少NULL).

因此,您可能需要对内容进行更全面的分析,您可以使用以下脚本获得:

DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';

SELECT
  @sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
  SELECT
    ColumnExpression =
      'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
      'WHEN COUNT(*) THEN ''UNIQUE'' ' +
      'WHEN COUNT(*) - 1 THEN ' +
        'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
        'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE WITH SINGLE NULL'' ' +
        'ELSE '''' ' +
        'END ' +
      'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE with NULLs'' ' +
      'ELSE '''' ' +
      'END AS ' + COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = @table
) s

SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql;  /* in case you still want to have a look at the resulting query */
EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)

该解决方案采用的NULL考虑通过检查三个值:COUNT(DISTINCT column),COUNT(column)COUNT(*).它显示的结果与前一种解决方案类似,但列的可能诊断更加多样化:

  • UNIQUE 表示没有重复值且没有NULL(可以是PK或具有唯一约束/索引);

  • UNIQUE WITH SINGLE NULL - 可以猜到,没有重复,但有一个NULL(不能是PK,但可以有一个唯一的约束/索引);

  • UNIQUE with NULLs - 没有重复,两个或多个NULL(如果你在SQL Server 2008上,你可以只有非NULL值的条件唯一索引);

  • 空字符串 - 有重复项,也可能是NULL.