2017-05-03 1 views
2

Ich habe eine Anwendung, die startet (AppStarter) einen Webserver mit einer Webanwendung. Die Webanwendung verfügt über Migrationsskripts (Flyway).ALTER TABLE CREATE CONSTRAINT WENN NICHT EXISTIEREN möglich?

Ich möchte einige Daten von AppStarter über JDBC in einer Tabelle schreiben. Aber ich möchte die Tabelle erstellen, wenn sie nicht existiert. Die Tabelle hat auch einige Einschränkungen.

Im AppStarter mir folgenden Befehl:

CREATE CACHED TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER (
    ID VARCHAR(32) PRIMARY KEY NOT NULL, 
    VERSION INTEGER, 
    USER_ID VARCHAR(32)NOT NULL, 
    ROLE_ID VARCHAR(32) NOT NULL, 
    PARAMETER VARCHAR(255) NOT NULL 
); 

ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER ADD CONSTRAINT PUBLIC.CURTBP_USER_ID FOREIGN KEY(USER_ID) REFERENCES PUBLIC.CORE_USER(ID) NOCHECK; 
ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER ADD CONSTRAINT PUBLIC.CURTBP_ROLE_ID FOREIGN KEY(ROLE_ID) REFERENCES PUBLIC.CORE_USER_ROLE(ID) NOCHECK; 

Der Web-App liest auch einige Informationen aus dieser Tabelle und erstellt die Tabellen. Jetzt habe ich einen SQL-Migrationsskript

CREATE CACHED TABLE IF NOT EXISTS PUBLIC.CORE_USERROLE_TO_PARAMETER (
    ID VARCHAR(32) PRIMARY KEY NOT NULL, 
    VERSION INTEGER, 
    USER_ID VARCHAR(32)NOT NULL, 
    ROLE_ID VARCHAR(32) NOT NULL, 
    PARAMETER VARCHAR(255) NOT NULL 
); 

Aber wie erstelle ich die Einschränkung nur dann, wenn sie nicht bereits vorhanden ist?

Vielen Dank im Voraus

bekommen kann ich Zeit, wenn die Einschränkungen mit

select * from INFORMATION_SCHEMA.CONSTRAINTS WHERE CONSTRAINT_NAME='CURTRP_USER_ID' 

existiert aber wie baue ich diese in eine, wenn Abfrage mit H2

Edit: ich konnte Verschieben Sie den Einschränkungsteil insgesamt in das Migrationsskript, aber das scheint irgendwie falsch zu sein.

Ich arbeite mit H2-Datenbank.

+0

Haben Sie 'IF NOT EXISTS' versucht? Die Dokumentation scheint zu suggerieren, dass dies möglich ist http://www.h2database.com/html/grammar.html#constraint_name_definition – Sonata

Antwort

1

mein Kommentar Folgen, dies möglich sein sollte:

ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER ADD CONSTRAINT IF NOT EXISTS PUBLIC.CURTBP_USER_ID FOREIGN KEY(USER_ID) REFERENCES PUBLIC.CORE_USER(ID) NOCHECK; 
ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER ADD CONSTRAINT IF NOT EXISTS PUBLIC.CURTBP_ROLE_ID FOREIGN KEY(ROLE_ID) REFERENCES PUBLIC.CORE_USER_ROLE(ID) NOCHECK; 
+0

So offensichtlich, ich dachte, ich habe es versucht, aber anscheinend habe ich versagt, während ich es versuchte. Danke – kism3t

0

Verwenden Sie diese Abfrage, um die Fremdschlüssel-Constraints zu bekommen SELECT * FROM INFORMATION_SCHEMA.CONSTRAINTS WHERE CONSTRAINT_TYPE = 'REFERENTIAL'

-1

Sie können ALTER versuchen TABLE IF EXISTS wie CREATE IF EXISTS. Wenn es nur eine Verantwortung Ihrer Anwendung ist und nicht von einer anderen App oder einem anderen Skript bearbeitet wird.

+0

Das ist völlig unlesbar. Bitte beachten Sie die Verwendung von [Markdown] (http://stackoverflow.com/editing-help). Verwenden Sie auch * ganze Stopps * ('.'), um das Ende eines Satzes zu markieren. – derM