声明该列是唯一的是否有任何意义?

时间:2011-07-09 17:35:06

标签: mysql sql sql-server database performance

当我国外引用一个表时,将该列声明为唯一是否有任何意义?

我的意思当然是我引用的那个列是唯一的。

4 个答案:

答案 0 :(得分:3)

是,请查看以下情况:

表1的id字段是您的外键。这是一个独特的指数。

Table 1:
________________________  
| id |  value | blah... |  
|----|--------|---------|  
| 0  |  val 1 | ....    |  
|----|--------|---------|  
| 1  |  val 2 | ....    |  
|----|--------|---------|  
 ...    ...       ...

现在表2有两种可能性。

1)table_1_id不是唯一的

Table 2:
_____________________________
| id |  table_1_id | blah... |  
|----|-------------|---------|  
| 0  |      1      | ....    |  <------ Duplicates are okay!
|----|-------------|---------|  <--/
| 1  |      1      | ....    |  
|----|-------------|---------|  
 ...    ...       ...

2)table_1_id是唯一的

Table 2:
_____________________________
| id |  table_1_id | blah... |  
|----|-------------|---------|  
| 0  |      1      | ....    |  
|----|-------------|---------|  
| 1  |      n      | ....    |  <------- Cannot be 1, no duplicates
|----|-------------|---------|  
 ...    ...       ...

答案 1 :(得分:1)

如果您希望它是唯一的,请将其声明为唯一。

答案 2 :(得分:1)

多个记录可以引用另一个表中的单行,并且它是完全有效的数据库设计(1:M关系)。所以问题是,第二个表中的字段应该是唯一的还是不唯一的。从问题中你不清楚你的性能考虑因素

答案 3 :(得分:1)

正如@yi_H所说,通常会创建唯一约束来强制执行管理数据的规则。但是,由于唯一约束等同于唯一索引,因此创建它们有一些优点和缺点。字段上的索引将需要更多时间来执行对该字段的插入或更新,因为需要检查索引是否有重复项并进行更新。索引也会增加表的大小。在专业方面,如果您根据该字段的值(即WHERE myUniqueField = 5JOIN myTable ON myUniqueField = someOtherIndexedField)执行查询,那么这些查询将运行得更快,因为它们可以执行索引搜索而不是扫描。这些注意事项仅在您拥有大量数据或需要快速运行大量查询时才会发挥作用。因此,通常情况下,如果您有一个应该唯一的字段,请将其设置为唯一。