重复主键?

时间:2014-01-25 15:12:33

标签: sql

查看Java Persistence with Hibernate的示例,有2个表:

create table USERS (
    USER_ID bigint not null primary key,
    USERNAME varchar(15) not null unique,
    NAME varchar(50) not null,
    ...
)
create table BILLING_DETAILS (
    BILLING_DETAILS_ID bigint not null primary key,
    ACCOUNT_NUMBER VARCHAR(10) not null unique,
    ACCOUNT_NAME VARCHAR(50) not null,
    ACCOUNT_TYPE VARCHAR(2) not null,
    USER_ID bigint foreign key references USERS
)

本书提到以下内容表示many-to-one关系:

USER_ID bigint foreign key references USERS

接下来,它说以下SQL语句显示one-to-one个关联:

USER_ID bigint unique foreign key references USERS
BILLING_DETAILS_ID bigint primary key foreign key references USERS

据我了解,第一个语句意味着USER_ID表的BILLING_DETAILS将是唯一的,并引用USERS表的primary_key,即references USERS

第二个使BILLING_DETAILS_ID成为primary_key并引用USERS的主键。

如果我们同时使用这两种one-to-one关系,那么我们会有重复的字段:USER_IDBILLING_DETAILS_ID,因为它们实际上是相同的数据?

2 个答案:

答案 0 :(得分:1)

如果没有额外的CHECK()约束要求用户ID和结算明细ID相等,它们不一定是相同的数据。

我没有读过这本书,但作为一名数据库专家,我认为一对一关系的实现是错误的。对billing_details.user_id的唯一约束及其明显的外键约束足以保证两个表之间的一对一关系。 (这样的关系并没有多大意义,在现实世界中,不过,当你想想的结算明细的意思。)

从数据库的角度来看,让billing_details.user_id可以为空可能也是值得怀疑的。


稍后。 。

我只是想到了这本书所说的另一种解释。什么时候说

USER_ID bigint unique foreign key references USERS
BILLING_DETAILS_ID bigint primary key foreign key references USERS

它描述了两种不同的方式来实现一对一的关系。它并不是说您应该使用两个语句来实现一个一对一的关系。

但是,这也是一个错误,因为USER_ID未声明为NOT NULL。

答案 1 :(得分:0)

BILLING_DETAILS_ID实际上是主键,这意味着它无法复制。但是,USER_ID不是,您可以在表BILLING_DETAILS中具有重复的USER_ID,它被视为应在表USER中具有引用的数据。

BILLING_DETAILS和USER之间的关系是一个(USER)到多个(BILLING_DETAILS)