2016-11-23 90 views
2

我发现了一些遗留代码,它为主键字段设置了两个几乎相同的约束条件(UNIQUEPRIMARY KEY)。MySQL。同一字段的UNIQUE和PRIMARY KEY约束

下面是代码示例:

CREATE TABLE foofoo (
    id NUMERIC(9) NOT NULL , 
    bar VARCHAR(40) NOT NULL, 

    CONSTRAINT PK_foofoo PRIMARY KEY (id), 
    CONSTRAINT UNIQUE_foofoo UNIQUE(id) 
) 

,我认为它是多余的,在这两种组和PRIMARY KEY会做的工作。

当然,我读什么是这两个约束之间的差异,但

什么是对同一领域设置这两个约束的地步?

+0

可能重复[主键和唯一键之间的区别](http://stackoverflow.com/questions/9565996/difference-between-primary -key-and-unique-key) – e4c5

+0

e4c5我没有要求区别,我在问为什么任何人都应该为相同的字段设置这两个约束。也许这背后有一个原因。 – Benas

+1

@ e4c5,你认为这是相关答案的重复吗?你可以解释吗。 – Rahul

回答

2

这样做没有意义。主键本质上总是唯一的。我建议不要创建两个索引,因为索引带有成本(主要是磁盘空间)。只需创建PK,你就会很棒!

+1

另外,既然您在问这个问题,我强烈建议您尽可能多地阅读索引。它们是非常棒的东西,非常方便,但它们是一把双刃剑。如果不小心使用它们,它们可能会变得非常巨大,但如果使用得当,它们可以创造奇迹。对这里的简单评论几乎不会抓到表面,所以是的,我推荐阅读这个主题。通过添加一个简单的索引,我可以从几分钟到几秒钟加快查询速度。但是,再次注意你所做的事情,他们最终可能会让你付出的代价超过他们给你的。 –

+1

我已经看到数据库的字面千兆无用索引...也不要忘记那些也与您的数据库备份。因此,如果您设置频繁的备份,比如每天晚上或类似的事情,那么您的索引不仅会使您的生产数据库变大,而且还会使备份和开发数据库变得更大(如果有的话)。所以再读一遍,他们很棒,但不要滥用它们! –

1

设置与PK完全相同的限制没有意义。

主键已经确保此列是唯一的且已编制索引。

1

,我认为它是多余的......

是的确它是多余的;因为无论如何对列有主键约束将确保该列只有唯一的值。在同一列上定义一个额外的UNIQUE约束没有意义。

1

在声明初级那么: * PRIMARY KEY约束唯一标识数据库表中的记录 *主键必须包含唯一值 所以他们没有必要申报主键独一无二的,因为每当ü声明任何主键然后UNIQUE值已经附加在它们上面。 对于唯一键: * UNIQUE约束唯一标识数据库表中的每条记录。 * UNIQUE和PRIMARY KEY约束条件都为一列或一组列的唯一性提供了保证。 * PRIMARY KEY约束自动在其上定义一个UNIQUE约束。 最重要的一点是 *请注意,每个表可以有多个UNIQUE约束,但每个表只能有一个PRIMARY KEY约束。 在MySQL中,当我采取相同的主键和唯一那么它给了我错误