Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 当用户未定义候选键(或主键,如果可能的话)时,如何在sql中查找它们?_Sql Server 2008_Primary Key - Fatal编程技术网

Sql server 2008 当用户未定义候选键(或主键,如果可能的话)时,如何在sql中查找它们?

Sql server 2008 当用户未定义候选键(或主键,如果可能的话)时,如何在sql中查找它们?,sql-server-2008,primary-key,Sql Server 2008,Primary Key,假设我遇到一个设计糟糕的SQL server数据库,其中designer没有为表创建任何主键。 对于数据库中的每个表,是否有标准的或性能良好的算法来查找并建议主键? 我不想将任何列生成为键或其他内容,我只想建议表中可能的高键。例如,国家编号,用于未在该表中声明为主键但在所有行中都是唯一的人 是否有任何标准的或性能良好的[sic]算法可以为数据库中的每个表查找并建议主键 对于这种问题,没有什么比暴力更好的了。在没有任何主键或NOTNULL unique约束的情况下,任何列的组合都可以是候选键。当然

假设我遇到一个设计糟糕的SQL server数据库,其中designer没有为表创建任何主键。 对于数据库中的每个表,是否有标准的或性能良好的算法来查找并建议主键? 我不想将任何列生成为键或其他内容,我只想建议表中可能的高键。例如,国家编号,用于未在该表中声明为主键但在所有行中都是唯一的人

是否有任何标准的或性能良好的[sic]算法可以为数据库中的每个表查找并建议主键

对于这种问题,没有什么比暴力更好的了。在没有任何主键或NOTNULL unique约束的情况下,任何列的组合都可以是候选键。当然,可能根本就没有候选密钥

候选键的显著特征是它在表中是唯一的。因此,您可以查询列的每个组合,并在找到返回表中相同行数的组合时停止

例如,假设我们有这个表

create table no_key (
  col_1 integer,
  col_2 varchar(15),
  col_3 varchar(10)
);

insert into no_key values
(1, 'Eh?', 'Oh, no.'),
(2, 'Eh?', 'Oh, no.'),
(3, 'Oh.', 'Not good.');

select count(*) from no_key;  -- The table has 3 rows. 
您需要使用动态SQL来生成所有可能的查询。对于这个例子,我将手工写出它们

-- Three columns taken one at a time.
select count(distinct col_1) from no_key; -- 3, a possible key
select count(distinct col_2) from no_key; -- 2, can't be a key
select count(distinct col_3) from no_key; -- 2, can't be a key

-- Three columns taken two at a time.
select count(distinct (col_1, col_2)) from no_key; -- 3, a possible key
select count(distinct (col_2, col_3)) from no_key; -- 2, can't be a key
select count(distinct (col_1, col_3)) from no_key; -- 3, a possible key

-- Three columns taken three at a time.
select count(distinct (col_1, col_2, col_3)) from no_key; -- 3, a possible key

您可能会在从no_key;中选择countdistinct col_1之后停止;,并向用户提供col_1。但是插入的下一行可能是{3,'Oh.','Oh,no.},在这种情况下,只有col_1,col_2,col_3可以是键。

实际上我更喜欢代理键,只需添加另一列,如ID identity。自然键通常包含一些列,并且倾向于增加表的大小,而不仅仅是增加一个额外的列。创建外键也很痛苦。您应该在另一个表中添加所有列等。