如何在数组数据类型的元素上添加外键约束
How to add a foreign key constraint on the elements of array data type
我正在尝试执行此 hsql 查询,但我正在执行,因为 PATIENTVISIT 中的 'SYMPTOMS' 是 Array Varchar() 类型,而 table 中的 'SYMPTOM_NAME' SYMPTOMS 是类型变量():
ALTER TABLE PATIENTVISIT ADD CONSTRAINT IF NOT EXISTS
PATIENTVISIT_SYMPTOMS_FK FOREIGN KEY (SYMPTOMS) REFERENCES SYMPTOMS(SYMPTOM_NAME);
我得到的异常是:
java.sql.SQLSyntaxErrorException: incompatible data types in combination in statement [ALTER TABLE PATIENTVISIT ADD CONSTRAINT IF NOT EXISTS PATIENTVISIT_SYMPTOMS_FK FOREIGN KEY (SYMPTOMS) REFERENCES SYMPTOMS(SYMPTOM_NAME)]
如何解决这个问题或解决方法是什么?
您只想将 SYSMPTOM_NAME 列中的值用作 PATIENTVISIT 中数组的元素。仅允许识别的 SYMPTOM_NAME 值作为有效症状。
无法使用 FOREIGN KEY 定义此类约束。
您可以在 PATIENTVISIT table 上使用 TRIGGER,根据 SYMPTOMS table 中的元素检查数组的所有元素,如果存在无法识别的值,则抛出异常。
CREATE TRIGGER CHECK_VALUES BEFORE INSERT ON PATIENTVISIT REFERENCING NEW ROW AS NEWROW FOR EACH ROW
BEGIN ATOMIC
IF EXISTS (SELECT TRUE FROM UNNEST (NEWROW.SYMPTOMS) X(A) LEFT JOIN SYMPTOMS ON X.A = SYMPTOMS.SYMPTOM_NAME WHERE SYMPTOMS.SYMPTOM_NAME IS NULL)
THEN
SIGNAL SQLSTATE '45000';
END IF;
END
我正在尝试执行此 hsql 查询,但我正在执行,因为 PATIENTVISIT 中的 'SYMPTOMS' 是 Array Varchar() 类型,而 table 中的 'SYMPTOM_NAME' SYMPTOMS 是类型变量():
ALTER TABLE PATIENTVISIT ADD CONSTRAINT IF NOT EXISTS
PATIENTVISIT_SYMPTOMS_FK FOREIGN KEY (SYMPTOMS) REFERENCES SYMPTOMS(SYMPTOM_NAME);
我得到的异常是:
java.sql.SQLSyntaxErrorException: incompatible data types in combination in statement [ALTER TABLE PATIENTVISIT ADD CONSTRAINT IF NOT EXISTS PATIENTVISIT_SYMPTOMS_FK FOREIGN KEY (SYMPTOMS) REFERENCES SYMPTOMS(SYMPTOM_NAME)]
如何解决这个问题或解决方法是什么?
您只想将 SYSMPTOM_NAME 列中的值用作 PATIENTVISIT 中数组的元素。仅允许识别的 SYMPTOM_NAME 值作为有效症状。
无法使用 FOREIGN KEY 定义此类约束。
您可以在 PATIENTVISIT table 上使用 TRIGGER,根据 SYMPTOMS table 中的元素检查数组的所有元素,如果存在无法识别的值,则抛出异常。
CREATE TRIGGER CHECK_VALUES BEFORE INSERT ON PATIENTVISIT REFERENCING NEW ROW AS NEWROW FOR EACH ROW
BEGIN ATOMIC
IF EXISTS (SELECT TRUE FROM UNNEST (NEWROW.SYMPTOMS) X(A) LEFT JOIN SYMPTOMS ON X.A = SYMPTOMS.SYMPTOM_NAME WHERE SYMPTOMS.SYMPTOM_NAME IS NULL)
THEN
SIGNAL SQLSTATE '45000';
END IF;
END