0

说,我有一个 3 列(varchar 类型)的表,唯一键 = 3 列的组合。我是否应该再创建 1 个列(int 类型)并为其设置主键,当然我们仍然设置唯一的(column1、column2、column3)?

那么哪个更好呢?3 个唯一列或 4 个列(1 个主键 + 3 个唯一列),为什么您认为该选项更好?

4

3 回答 3

1

额外的伪键列的​​一个优点是更容易为您的表创建 FK,因为您只有一列要引用

于 2013-04-19T05:08:56.453 回答
1

构建该表有三种合理的方法。基本的关系原则是所有已知的约束都必须声明给 dbms,因此 dbms 可以强制执行它们。在所有情况下,可能必须将包含真实数据的三列声明为 NOT NULL。

create table wibble (
  column_1 data-type not null,
  column_2 data-type not null,
  column_3 data-type not null,
  primary key (column_1, column_2, column_3)
);

create table wibble (
  surrogate_id_number integer primary key,
  column_1 data-type not null,
  column_2 data-type not null,
  column_3 data-type not null,
  unique (column_1, column_2, column_3)
);

create table wibble (
  surrogate_id_number integer not null unique,
  column_1 data-type not null,
  column_2 data-type not null,
  column_3 data-type not null,
  primary key (column_1, column_2, column_3)
);

很明显,仅在 ID 号列上的主键约束不可能起作用。将允许这样的重复数据。

1  Value1  Value2  Value3
2  Value1  Value2  Value3
3  Value1  Value2  Value3
4  Value1  Value2  Value3
5  Value1  Value2  Value3
于 2013-04-19T11:26:25.930 回答
0

按照我的说法,您应该将所有列设为主键,因为它永远不允许空值,并且主键索引是表的最有效访问路径。相反,这取决于您的要求是否需要 int 类型 id。

于 2013-04-19T08:25:22.950 回答