Sql server 2008 当用户未定义候选键(或主键,如果可能的话)时,如何在sql中查找它们?
假设我遇到一个设计糟糕的SQL server数据库,其中designer没有为表创建任何主键。 对于数据库中的每个表,是否有标准的或性能良好的算法来查找并建议主键? 我不想将任何列生成为键或其他内容,我只想建议表中可能的高键。例如,国家编号,用于未在该表中声明为主键但在所有行中都是唯一的人 是否有任何标准的或性能良好的[sic]算法可以为数据库中的每个表查找并建议主键 对于这种问题,没有什么比暴力更好的了。在没有任何主键或NOTNULL unique约束的情况下,任何列的组合都可以是候选键。当然,可能根本就没有候选密钥 候选键的显著特征是它在表中是唯一的。因此,您可以查询列的每个组合,并在找到返回表中相同行数的组合时停止 例如,假设我们有这个表Sql server 2008 当用户未定义候选键(或主键,如果可能的话)时,如何在sql中查找它们?,sql-server-2008,primary-key,Sql Server 2008,Primary Key,假设我遇到一个设计糟糕的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。自然键通常包含一些列,并且倾向于增加表的大小,而不仅仅是增加一个额外的列。创建外键也很痛苦。您应该在另一个表中添加所有列等。