说,我有一个 3 列(varchar 类型)的表,唯一键 = 3 列的组合。我是否应该再创建 1 个列(int 类型)并为其设置主键,当然我们仍然设置唯一的(column1、column2、column3)?
那么哪个更好呢?3 个唯一列或 4 个列(1 个主键 + 3 个唯一列),为什么您认为该选项更好?
说,我有一个 3 列(varchar 类型)的表,唯一键 = 3 列的组合。我是否应该再创建 1 个列(int 类型)并为其设置主键,当然我们仍然设置唯一的(column1、column2、column3)?
那么哪个更好呢?3 个唯一列或 4 个列(1 个主键 + 3 个唯一列),为什么您认为该选项更好?
额外的伪键列的一个优点是更容易为您的表创建 FK,因为您只有一列要引用
构建该表有三种合理的方法。基本的关系原则是所有已知的约束都必须声明给 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
按照我的说法,您应该将所有列设为主键,因为它永远不允许空值,并且主键索引是表的最有效访问路径。相反,这取决于您的要求是否需要 int 类型 id。