【问题标题】:creating a table with reference to a non primary key column参考非主键列创建表
【发布时间】:2013-10-27 06:02:04
【问题描述】:

我有两个表用户和商店

Users 表主键是地址和电话号码的组合(用户通过网页注册,我不希望同一个用户注册两次),userId 列是序列但不是主键

在 Stores 表中,ownerID 列是用户表中的 userID - 但由于它不是主键,因此无法设置引用(尽管它是串行的)

我怎样才能达到这个结果?

【问题讨论】:

  • 我不确定您要达到什么目的,但是将地址和电话号码组合为主键不是一个好主意!
  • 如果您的表中有一个 UserId,那么我建议您将其作为主键,因为这样会更好!
  • @RahulTripathi 将密钥放在串​​行列上不会验证用户的重复,将其放在计数的列上将消除插入时的重复
  • 我可能没有正确理解它,但我的意思是说您可以创建 UserId 作为主键。如果 UserId 是主键,那么这将是唯一的,并且还可以帮助您删除重复项。(虽然这种情况很少见,但如果两个用户共享相同的地址和电话号码怎么办?)
  • 地址和电话号码是一个糟糕的 PK,因为它们通常可以识别几个人(考虑一个有固定电话的家庭或有几个员工的企业)。即使您在地址和电话号码上添加 UNIQUE 约束,也会遇到问题。

标签: sql postgresql foreign-key-relationship


【解决方案1】:

引用的列不必是主键。

外键可以引用主键或唯一约束的列。

这可以通过这种方式完成:

CREATE TABLE Users(
  address varchar(100),
  phone_number varchar(20),
  userid serial,
  constraint pk primary key (address, phone_number ),
  constraint userid_unq unique (userid)
);

create table Stores(
  storeid int primary key,
  ownerID integer,
  constraint b_fk foreign key (ownerID)
    references Users(userid)
);

【讨论】:

    【解决方案2】:

    您应该将 userid 设为主键,以便在外键中轻松引用它。为了消除电话和地址的重复,您可以为这些列定义唯一约束或唯一索引。

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多