【问题标题】:I have two primary keys how can I make it so that we can't use either one of the key again我有两个主键,我怎样才能使我们不能再次使用其中一个键
【发布时间】:2020-06-29 01:24:24
【问题描述】:
APPOINTMENT
<PK> PID:                  NUMBER(3,0)
<PK> appointmentDate:      TIMESTAMP
reason_for_visit:          VARCHAR(150)
assigned_Doctor:           REF DOCTOR_ty

我想这样做,以便患者只能进行一次预约,并且预约时间不会发生冲突。例如,如果 PID = 101 并且约会日期是 03/17/20 3:00 PM。以下不能发生 PID = 102 03/17/20 3:00 PM 或 PID = 101 03/18/20 PM。我认为我使用主键错误的方式来表示这种情况。你们对实施这个问题有什么建议吗?我必须创建一个单独的表吗?创建成员函数?因为我的约会表是一个对象,但我还没有足够的经验来编写函数但是如果你这样做,请帮助我用函数实现这种情况。 -谢谢

【问题讨论】:

  • 每个表只能有一个主键。可以有多个(可能是候选)键,表示为唯一索引或其变体。根据需要,所有键都可以是复合键。
  • 为什么将PID定义为NUMBER(3,0)?这意味着您最多可以有 1999 个可能的值(假设允许负数和零)。这似乎相当严格。

标签: sql oracle primary-key create-table unique-key


【解决方案1】:

一张表只能有一个主键。但您可以拥有任意数量的唯一键。

所以你可以让一个作为主键,另一个作为唯一键:

create table appointment(
    pid                 number(3, 0) primary key,
    appointment_date    timestamp unique,
    reason_for_visit    varchar2(150),
    ...
)

此设置可防止 pidappointment_date 列中的重复。

【讨论】:

  • 如果超过 2 个用户在同一日期有约会怎么办?我认为OP想要复合PK。检查这个sqlfiddle.com/#!4/8932f
【解决方案2】:

您可以在表上为多个列定义唯一约束。

ALTER TABLE APPOINTMENT
ADD CONSTRAINT constraint_name UNIQUE (PID,appointmentDate );

【讨论】:

    【解决方案3】:

    一个表只能有一个主键,但是一个主键可以由多个(最多 16 个)列组成。

    ALTER TABLE APPOINTMENT
    ADD CONSTRAINT constraint_name PRIMARY KEY (PID, appointmentDate);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      相关资源
      最近更新 更多