【问题标题】:Alter table structure without violating primary key and unique constraints在不违反主键和唯一约束的情况下更改表结构
【发布时间】:2019-05-28 12:34:07
【问题描述】:

Here 是我拥有的逻辑模型。

以下是表结构及其约束

医生

CREATE TABLE doctor (
    doctor_id      NUMBER(4) NOT NULL,
    doctor_title   VARCHAR2(2) NOT NULL,
    doctor_fname   VARCHAR2(50),
    doctor_lname   VARCHAR2(50),
    doctor_phone   CHAR(10) NOT NULL
);
ALTER TABLE doctor ADD CONSTRAINT doctor_pk PRIMARY KEY ( doctor_id );

程序

CREATE TABLE procedure (
    proc_code          NUMBER(5) NOT NULL,
    proc_name          VARCHAR2(100) NOT NULL,
    proc_description   VARCHAR2(300) NOT NULL,
    proc_time          NUMBER(3) NOT NULL,
    proc_std_cost      NUMBER(7, 2) NOT NULL
);

ALTER TABLE procedure ADD CONSTRAINT procedure_pk PRIMARY KEY ( proc_code );

ALTER TABLE procedure ADD CONSTRAINT proc_name_unq UNIQUE ( proc_name );

入场

CREATE TABLE admission (
    adm_no          NUMBER(6) NOT NULL,
    adm_date_time   DATE NOT NULL,
    adm_discharge   DATE,
    patient_id      NUMBER(6) NOT NULL,
    doctor_id       NUMBER(4) NOT NULL
);

ALTER TABLE admission ADD CONSTRAINT admission_pk PRIMARY KEY ( adm_no );    --surrogate key

ALTER TABLE admission ADD CONSTRAINT admission_nk UNIQUE ( patient_id,
                                                           adm_date_time );

入学手续

CREATE TABLE adm_prc (
    adprc_no           NUMBER(7) NOT NULL,
    adprc_date_time    DATE NOT NULL,
    adprc_pat_cost     NUMBER(7, 2) NOT NULL,
    adprc_items_cost   NUMBER(6, 2) NOT NULL,
    adm_no             NUMBER(6) NOT NULL,
    proc_code          NUMBER(5) NOT NULL,
    request_dr_id      NUMBER(4) NOT NULL,
    perform_dr_id      NUMBER(4)
);
ALTER TABLE adm_prc ADD CONSTRAINT adm_prc_pk PRIMARY KEY ( adprc_no );    --surrogate key
ALTER TABLE adm_prc ADD CONSTRAINT adm_prc_nk UNIQUE ( adprc_date_time,
                                                       adm_no );
ALTER TABLE adm_prc
    ADD CONSTRAINT admission_admprc FOREIGN KEY ( adm_no )
        REFERENCES admission ( adm_no );
ALTER TABLE adm_prc
    ADD CONSTRAINT doctor_performadmprc FOREIGN KEY ( perform_dr_id )
        REFERENCES doctor ( doctor_id );
ALTER TABLE adm_prc
    ADD CONSTRAINT doctor_requestadmprc FOREIGN KEY ( request_dr_id )
        REFERENCES doctor ( doctor_id );

物品处理

CREATE TABLE item_treatment (
    adprc_no             NUMBER(7) NOT NULL,
    item_code            CHAR(5) NOT NULL,
    it_qty_used          NUMBER(2) NOT NULL,
    it_item_total_cost   NUMBER(8, 2) NOT NULL
);

ALTER TABLE item_treatment
    ADD CONSTRAINT item_treatment_pk PRIMARY KEY ( adprc_no,item_code);
ALTER TABLE item_treatment
    ADD CONSTRAINT admprc_itemtreatment FOREIGN KEY ( adprc_no )
        REFERENCES adm_prc ( adprc_no );
ALTER TABLE item_treatment
    ADD CONSTRAINT admprc_itemtreatment FOREIGN KEY ( adprc_no )
        REFERENCES adm_prc ( adprc_no );
ALTER TABLE item_treatment
    ADD CONSTRAINT item_itemtreatment FOREIGN KEY ( item_code )
        REFERENCES item ( item_code );

在虚构的医院中,每次为患者入院完成入院程序时,执行该程序的主治医生都会记录在adm_prc 表中的perform_dr_id 下。即使由一组医生执行该程序,也只会记录主治医生。

医院现在希望记录所有在入院过程中执行的医生,包括一名辅助医生(助理医生)。

我已更改 adm_prc 表以包括辅助医生

ALTER TABLE ADM_PRC ADD ANCILLARY_DR_ID NUMBER(4);
ALTER TABLE ADM_PRC
    ADD CONSTRAINT DOCTOR_PERFORM_ANCILLARY FOREIGN KEY ( ANCILLARY_DR_ID )
        REFERENCES DOCTOR ( DOCTOR_ID );

我需要更改数据库的结构,这样,同一个入院程序应该有多个记录,因为一个入院程序可以有很多医生协助。比如我应该可以在adm_prc表中插入如下记录

adprc_no  adprc_date_time  adprc_pat_cost  adprc_items_cost  adm_no  proc_code 
 request_dr_id  perform_dr_id  ancillary_dr_id
-----------------------------------------------------------------------------------------------------------------------------
1         14/03/2019       100             100               1234    1234         
 10             10             12
1         14/03/2019       100             100               1234    1234         
 10             10             13

但是,这违反了主键约束adm_prc_pk

我被困在这一点上,无法继续前进。如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

  • 由于入院和辅助医生之间没有 n:1 对应关系,您不应该在入院中添加一列,而是创建一个新的明细表(表示入院的 fk),您可以在其中保存多个每次入院记录(每位助理医生一份)。
  • 感谢 Radagast81 的建议。毕竟我必须创建一个新表。不知怎的,我没有看到它。非常感谢

标签: sql database oracle constraints primary-key


【解决方案1】:

您应该创建一个新的卫星表(例如 ADM_PRC_DR_DTLS)来保存 adprc_no 和相应的 dr_id 详细信息。 ADM_PRC_DR_DTLS 的 adprc_no 将 ADM_PRC 的 adprc_no 称为​​外键。

【讨论】:

  • 是的,这行得通。通过创建一个新表 ADM_PRC_DR_DTLS,其中 ADM_PRC 的 adprc_no 作为外键,医生的医生 ID 作为外键。我将两列都设为主键,现在对于同一个 adprc_no,我可以拥有许多辅助医生。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2019-05-03
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多