如何对数组数据类型的元素添加外键约束

Posted

技术标签:

【中文标题】如何对数组数据类型的元素添加外键约束【英文标题】:How to add a foreign key constraint on the elements of array data type 【发布时间】:2017-12-17 16:29:31 【问题描述】:

我正在尝试执行此 hsql 查询,但我正在执行,因为 PATIENTVISIT 中的 'SYMPTOMS' 属于 Array Varchar() 类型,而表 SYMPTOMS 中的 'SYMPTOM_NAME' 属于 varchr() 类型:

 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)]

如何解决此问题或解决方法是什么?

【问题讨论】:

FK 表示某些列的子行值出现在别处。所以列类型必须相同。他们不是,所以你不能执行那个。解释你想要完成什么。请阅读minimal reproducible example并采取行动。 ***.com/q/15513728/3404097的可能重复 【参考方案1】:

您只想将 SYSMPTOM_NAME 列中的值用作 PATIENTVISIT 中数组的元素。仅允许识别的 SYMPTOM_NAME 值作为有效症状。

这种类型的约束不能使用 FOREIGN KEY 来定义。

您可以在 PATIENTVISIT 表上使用 TRIGGER,将数组的所有元素与 SYMPTOMS 表中的元素进行对比,如果存在无法识别的值,则会引发异常。

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

【讨论】:

以上是关于如何对数组数据类型的元素添加外键约束的主要内容,如果未能解决你的问题,请参考以下文章

判断子表外键约束参数类型

06约束

Laravel 5.2 迁移:无法添加 char 数据类型的外键

在 oracle11g系统中 约束的类型都有哪些

mysql唯一约束

MySQL 数据类型和约束(外键是重点🙄)