0

我正在尝试分配主键,但某些数据重复?我们如何保留数据但仍然有主键?

4

5 回答 5

2

在 17 年的数据库工作中,我唯一一次遇到这种情况,是由于数据错误。一个客户已经两次以相同的 id 输入到一个没有主键的表中。

当需要声明主键时,需要先清除数据错误,才能使用最符合逻辑的列作为主键。

所以我的建议是查看表中的所有数据是否符合业务规则,并检查业务规则是否暗示使用该列作为主键。

于 2013-04-22T13:31:42.807 回答
1

您可以在要约束的列上手动创建非唯一索引,然后使用novalidate子句添加主键约束,例如:

create table t1 (x number);

insert into t1 (x) values (1);
insert into t1 (x) values (1);
commit;

create index t1_pk on t1 (x);

alter table t1 add (
   constraint t1_pk primary key (x) novalidate
);

然而,我必须强调,尽管有可能,但这通常是糟糕的设计!

于 2013-04-22T12:09:29.960 回答
1

据我猜测,您有数据,并且您尝试将一列分配为主键,但是该数据具有该列的重复值。

主键必须是唯一的。那是数据库 101。如果唯一可用作主键的是重复项,则说明您的表结构不正确。

于 2013-04-22T12:03:07.907 回答
1

主键是一系列唯一值。因此,您可以保留重复数据,也可以拥有主键,但不能同时拥有。

或者,您可以通过将 ID 列添加到表并从序列中填充它来使用代理键。当然,在这种情况下,“主密钥”毫无意义,因为您没有强制执行业务密钥的唯一性。但至少你可以欺骗自己,你有真正的正直。

于 2013-04-22T12:01:28.300 回答
0

主键是唯一的,所以如果你想在某个列中有重复的数据,那么同一列不能是该表的主键。

于 2013-12-25T13:32:25.727 回答