运行一批涉及链接表(Oracle)的SQL插入语句



我希望在一批插入语句中填充由外键链接的多个表中的数据。

我的第一句话是这样的。。。

Insert into SCH2.PEOPLE_MEDICAL_CONDITIONS (ID,PERSON_CODE,CONDITION,START_DATE,END_DATE,IS_ACTIVE,CREATED_BY,CREATED_DATE,UPDATED_DATE,UPDATED_BY,IS_HEALTH_CARE_PLAN,IS_EMERGENCY_RESPONSE_PLAN,IS_ASCIA_PLAN,IS_HIGH_RISK,IS_ANAPHYLAXIS,IMPORTED_NOTES,DOCTOR_DETAIL_ID,DOCTOR_DIAGNOSED,STUDENT_HOSPITALISED_ALLERGY,HOSPITAL_NAME,REVIEW_DATE,USER_1,USER_2,USER_3,USER_4,USER_5,USER_6,USER_7,USER_8,USER_9,USER_10,USER_11,USER_12) values (PEOPLE_MEDICAL_CONDITIONS_SEQ.nextval,10014817,'Diabetes',to_date('01-JAN-00','DD-MON-RR'),null,'Y','MattOC.medtest',SYSDATE,null,null,'N','N','Y','N','N','Type 1',null,'Y','N','NNUH',null,null,null,null,null,null,null,null,null,null,null,null,null);

因为我想自动生成ID,所以我在ID字段中使用PEOPLE_MEDICAL_CONDITION_SEQ.nextval作为值。

然后,我希望立即运行另一个插入语句,该语句对我的第一个表(和插入语句)有外键

Insert into SCH2.PEOPLE_MEDICINE (ID,PERSON_CODE,MEDICAL_CONDITION_ID,MEDICINE_NAME,DUE,ADMINISTRATION,ADMINISTRATION_DETAILS,DOSAGE,IS_LOW_STOCK,IS_DISPENSED_DAILY,START_DATE,END_DATE,EXPIRY_DATE,CREATED_BY,CREATED_DATE,UPDATED_DATE,UPDATED_BY,IMPORTED_NOTES,MED_TYPE,PARENT_PROVIDED,REVIEW_DATE,USER_1,USER_2,USER_3,USER_4,USER_5,USER_6,USER_7,USER_8,USER_9,USER_10,USER_11,USER_12) values (PEOPLE_MEDICINE_SEQ.nextval,10014817,(SELECT ID FROM PEOPLE_MEDICAL_CONDITIONS WHERE CONDITION = 'Diabetes' AND CREATED_BY = 'MattOC.medtest'),'Insulin','INS','DAILY','3 times daily','80 units','N','Y',to_date('01-JAN-00','DD-MON-RR'),null,null,'MattOC.medtest',SYSDATE,null,null,'Insulin',null,'N',null,null,null,null,null,null,null,null,null,null,null,null,null);

SCH2.PEOPLE_MEDICINE.MEDICAL_CONDITION_ID = SCH2.PEOPLE_MEDICINE.ID

因为我在第一个insert语句中使用了autoincrement函数,所以我无法知道在第二个语句的MEDICAL_CONDITION_ID字段中要使用什么ID。我用这个来识别之前创建的记录,它感觉不太干净。。。

(SELECT ID 
 FROM PEOPLE_MEDICAL_CONDITIONS 
 WHERE CONDITION = 'Diabetes' AND CREATED_BY = 'MattOC.medtest')

因为数据不断进出这些表,所以我不愿意在插入语句中为ID字段设置实际值。

如果我想在由外键链接的多个表中插入数据,那么引用前一个insert语句的最佳方式是什么,它的主键需要在下面的insert语句中?

非常感谢,

因为我在第一个insert语句中使用了autoincrement函数,所以我无法知道在第二个语句的MEDICAL_CONDITION_ID字段中要使用什么ID

是的,你知道。你可以使用序列的currval列访问最后生成的值。

因此,只需在第二个insert语句中使用PEOPLE_MEDICAL_CONDITIONS_SEQ.currval即可。不需要另一个SELECT语句来检索该值。

您可以在手册中找到更多详细信息:http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns002.htm#i1009336

最新更新