约束问题,一列的值需要加上另一列的值(不同的表)

时间:2014-10-10 02:49:27

标签: mysql sql database oracle relational

处方表 处方ID(PK) 预约ID FK 数量 药物名称 患者姓名 医师姓名

约会表 预约ID(PK) 中心(FK) 患者ID(FK)

“每个处方(ID)由约会ID后跟序列号标识(例如,2003919_1,20030019_2)”

我已经建立了关系,但我如何建立约束?

1 个答案:

答案 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