2017-12-17 4 views
0

Ich versuche, diese HSQL-Abfrage auszuführen, aber ich bekomme die Ausführung, weil 'SYMPTOME' in PATIENTVISIT vom Typ Array Varchar() wo als 'SYMPTOM_NAME' in der Tabelle ist Problembeschreibung ist vom Typ varchr():Wie Sie eine Fremdschlüsseleinschränkung für die Elemente des Array-Datentyps hinzufügen

ALTER TABLE PATIENTVISIT ADD CONSTRAINT IF NOT EXISTS 
PATIENTVISIT_SYMPTOMS_FK FOREIGN KEY (SYMPTOMS) REFERENCES SYMPTOMS(SYMPTOM_NAME); 

die Ausnahme ich erhalte ist:

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

Wie dieses Problem zu beheben oder was ist die Abhilfe?

+0

Ein FK sagt, dass ein Subrow-Wert für einige Spalten an anderer Stelle erscheint. Daher müssen die Spaltentypen identisch sein. Sie sind nicht, also können Sie das nicht ausführen. Erklären Sie, was Sie erreichen möchten. Bitte lesen und handeln Sie auf [mcve]. – philipxy

+0

Mögliches Duplikat von https://stackoverflow.com/q/15513728/3404097 – philipxy

Antwort

0

Sie möchten nur die Werte in der Spalte SYSMPTOM_NAME als Elemente des Arrays in PATIENTVISIT verwenden. Nur die erkannten SYMPTOM_NAME-Werte sind als gültige Symptome zulässig.

Dieser Constrainttyp kann nicht mit einem FOREIGN KEY definiert werden.

Sie können einen TRIGGER für die Tabelle PATIENTVISIT verwenden, der alle Elemente des Arrays mit denen in der Tabelle SYMPTOMS vergleicht und eine Ausnahme auslöst, wenn ein nicht erkannter Wert vorhanden ist.

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 
Verwandte Themen