2017-07-04 1 views
0

Lors d'une tentative de créer la deuxième table dans cette base de données respective, je reçois le message d'erreur suivant:PostgresQL clé étrangère Erreur de syntaxe

ERROR: syntax error at or near "REFERENCES" 
LINE 3: master_directory REFERENCES auth_table (directory), 

Voici la structure de base de données que je tentais de créer:

CREATE TABLE auth_table (
id SERIAL PRIMARY KEY, 
directory VARCHAR, 
image VARCHAR 
) 

CREATE TABLE master_table (
id SERIAL PRIMARY KEY, 
master_directory references auth_table (directory), 
master_image references auth_table (image) 
) 

Une raison pour laquelle je reçois cette erreur? Toute aide serait appréciée!

+2

La colonne doit avoir un type de données (avant 'references') et les touches varchar sont généralement * * pas une bonne idée. De plus, il devrait y avoir un ';' après le ')' de vos définitions. – joop

+1

@joop oublié d'inclure le; dans ma définition, ma faute. et je ne savais pas que le type de données avant les références était nécessaire! J'ai un peu pensé que la référence prend toujours le même type de données que l'original. Merci beaucoup! –

Répondre

0

Vous avez désactivé le type de données, mais cette erreur de syntaxe est le moindre de vos problèmes.

Vos références de clés étrangères doivent faire référence à des colonnes uniques. Donc "auth_table" probablement doit être déclaré de l'une de ces façons. (Et vous voulez probablement le deuxième, si votre table a quelque chose à voir avec les chemins d'accès aux fichiers.)

CREATE TABLE auth_table (
    id SERIAL PRIMARY KEY, 
    directory VARCHAR not null unique, 
    image VARCHAR not null unique 
); 

CREATE TABLE auth_table (
    id SERIAL PRIMARY KEY, 
    directory VARCHAR not null, 
    image VARCHAR not null, 
    unique (directory, image) 
); 

Ces contraintes uniques signifient des choses tout à fait différentes, et chacun nécessite une autre référence clé étrangère. En supposant que vous voulez déclarer "auth_table" la deuxième manière, "master_table" devrait probablement être déclaré comme l'un de ceux-ci. (En ignorant les mises à jour Délibérément et des suppressions en cascade.)

CREATE TABLE master_table (
    master_directory varchar not null, 
    master_image varchar not null, 
    primary key (master_directory, master_image), 
    foreign key (master_directory, master_image) 
    references auth_table (directory, image) 
); 

CREATE TABLE master_table (
    id integer primary key, 
    foreign key (id) references auth_table (id) 
); 
+0

pour référencer une clé étrangère - cette valeur doit-elle être unique? comme si la valeur reste la même dans les deux tableaux? –

+0

Une contrainte de clé étrangère doit faire référence à une ou plusieurs colonnes qui ont une sorte de contrainte unique sur elles - '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –