sql - 判断一个表是否有一些唯一的列

标签 sql sql-server unique

我使用 SQL Server。

有人给了我一些大 table ,它们没有任何限制,没有 key ,什么也没有。

我知道某些列具有独特的值。对于给定的表是否有一种聪明的方法来查找具有唯一值的列?

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

SELECT COUNT(DISTINCT col) FROM table

可能可以让光标在所有列上循环,但想听听是否有人知道更智能或内置的函数。

最佳答案

这是一种基本上类似于 @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);

它只是将每列的 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);

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

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

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

  • UNIQUE with NULL – 没有重复项,两个或多个 NULL(如果您使用的是 SQL Server 2008,则可以仅对非 NULL 值使用条件唯一索引);

  • 空字符串 – 有重复项,也可能为 NULL。

关于sql - 判断一个表是否有一些唯一的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941049/

相关文章:

mysql - Phpmyadmin 出现错误

c# - Entity Framework -> 从 DB 中一条一条地获取记录或一次获取它们。哪个更快?

每个用户具有唯一值的 Java 变量

excel - 如何获取每个唯一值的行数(基于两列的组合)?

sql - Access 2003 中对多个字段的唯一约束

mysql - 子查询的自连接问题;想知道下面 2 个查询的区别

sql - data.table 连接的时间

sql-server - SQL select join 帮助

sql-server - Entity Framework 4 与 LINQ to SQL,适用于中小型应用程序,与 SQL Server 配合使用

sql - "Cluster"SQL 中的代码帮助