处方表 处方ID(PK) 预约ID FK 数量 药物名称 患者姓名 医师姓名
约会表 预约ID(PK) 中心(FK) 患者ID(FK)
“每个处方(ID)由约会ID后跟序列号标识(例如,2003919_1,20030019_2)”
我已经建立了关系,但我如何建立约束?
答案 0 :(得分:0)
要在约会ID字段上创建外键约束,您可以执行以下操作:
ALTER TABLE prescription
ADD CONSTRAINT fk_appointment
FOREIGN KEY (appointment_id)
REFERENCES appointment(appointment_id);
基本上意味着您创建的每个处方记录上的约会ID值必须存在于约会表中 - 这是您想要做的?
对 - 很抱歉没有回复你一段时间。
我在处方表上放置了一个插入前触发器,它基本上计算了新处方上预约ID已存在的行数,添加一个,然后将其用作处方ID:
CREATE OR REPLACE TRIGGER tr_prescription_appointment_id
BEFORE INSERT ON prescription
FOR EACH ROW
BEGIN
select to_char(:new.appointment_id) || '_' || to_char(count(prescription_id) + 1)
into :new.prescription_id
from prescription
where appointment_id = :new.appointment_id;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20700,'Error in setting new prescription_id for appointment_id: ' || :new.appointment_id || '. Error Message: '|| sqlerrm);
END tr_prescription_appointment_id;
/
在我的测试中,我刚用关键列创建了两个表,然后插入约会
select * from appointment
APPOINTMENT_ID
--------------
1
1 row selected.
然后插入处方 - 让触发器填充prescription_id列。
insert into prescription (appointment_id) values (1);
select * from prescription;
PRESCRIPTION_ID APPOINTMENT_ID
--------------- --------------
1_1 1
1 row selected.
再次预约1
insert into prescription (appointment_id) values (1);
PRESCRIPTION_ID APPOINTMENT_ID
--------------- --------------
1_1 1
1_2 1
2 rows selected.
希望能满足您的需求。
哦,如果在约会表中不存在处方的约会ID,则该错误只是一个直接的外键约束
ALTER TABLE prescription
ADD CONSTRAINT prescription_appointment_id_fk
FOREIGN KEY (appointment_id)
REFERENCES appointment (appointment_id)
ENABLE VALIDATE