2013-05-07 7 views
6

dato un tavolo nello schema radice:database di H2: facendo riferimento a una tabella nello schema radice da un vincolo di chiave esterna

CREATE TABLE user (
    username VARCHAR(50), 
    password VARCHAR(50)); 

e un tavolo in Quiz schema:

CREATE TABLE Quiz.Results (
    username VARCHAR(50), 
    points INT, 
    FOREIGN KEY (username) REFERENCES user(username)); 

non riesco per creare effettivamente la chiave esterna, in quanto il database afferma che la tabella user non esiste realmente. Né posso aggiungere successivamente la chiave esterna:

ALTER TABLE QUIZ.RESULTS 
    ADD FOREIGN KEY (username) REFERENCES user (username) 

Entrambe le tabelle sono, ovviamente, memorizzate nello stesso database.

Dato che questo è solo un pezzo di compiti a casa, sono più che felice di saltare semplicemente l'aggiunta di una chiave esterna. Ma sono curioso di sapere se questa è davvero una limitazione in H2, un bug o se funziona come previsto.

Posso in qualche modo fare riferimento alla tabella user all'esterno dello schema quiz?

risposta

14

È necessario impostare in modo esplicito il nome dello schema se si fa riferimento a una tabella in uno schema diverso. Il nome dello schema predefinito per H2 è public. Esempio:

CREATE TABLE user (
    username VARCHAR(50), 
    password VARCHAR(50)); 
create schema quiz; 
CREATE TABLE Quiz.Results (
    username VARCHAR(50), 
    points INT, 
    FOREIGN KEY (username) 
    REFERENCES public.user(username)); 

Per creare il vincolo di chiave esterna in seguito, utilizzare:

ALTER TABLE QUIZ.RESULTS 
    ADD FOREIGN KEY (username) 
    REFERENCES public.user(username) ; 
+0

Conoscere lo schema predefinito (quello che ho chiamato il 'schema di root') nome aiutato. Grazie! –

+0

Posso chiederti perché stai aggiungendo 'FOREIGN KEY (username)' due volte? Sembra che tu lo aggiunga una volta nella definizione della tabella per 'Quiz.Results', quindi una seconda volta nella tua istruzione' ALTER TABLE'. –

+0

@CraigOtis Hai ragione, dovrebbe essere l'uno o l'altro. Ho cambiato la risposta. –

0

sì molto possibile. È necessario utilizzare il nome dello schema corrispondente per entrambe le tabelle.

Supponiamo che il vostro nome dello schema defualt è DefaultSchema allora la vostra richiesta sarà

ALTER TABLE QUIZ.RESULTS 
ADD FOREIGN KEY (username) REFERENCES DefaultSchema.user (username) 
Problemi correlati