PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

SUPPRIMER DE ... signalant une erreur de syntaxe à ou près de .

Votre requête n'a aucun sens.

DELETE FROM database_userprofile WHERE user.username = 'some';
                                       ^^^^

Où était user viens de? Il n'est pas référencé dans la requête. Est-ce une colonne de database_userprofile ? Si c'est le cas, vous ne pouvez pas écrire user.username (sauf s'il s'agit d'un type composite, auquel cas il faudrait écrire (user).username dire à l'analyseur que; mais je doute que ce soit un type composite).

La cause immédiate est que user est un mot réservé . Vous ne pouvez pas utiliser ce nom sans le citer :

DELETE FROM database_userprofile WHERE "user".username = 'some';

... cependant, cette requête n'a toujours aucun sens, elle donnera juste une erreur différente :

regress=> DELETE FROM database_userprofile WHERE "user".username = 'some';
ERROR:  missing FROM-clause entry for table "user"
LINE 1: DELETE FROM database_userprofile WHERE "user".username = 'so...

Ma conjecture sauvage est que vous essayez de faire une suppression sur une jointure. Je suppose que vous avez des tableaux comme :

CREATE TABLE "user" (
    id serial primary key,
    username text not null,
    -- blah blah
);

CREATE TABLE database_userprofile (
     user_id integer references "user"(id),
     -- blah blah
);

et vous essayez de supprimer avec une condition dans l'autre table.

Si oui, vous ne pouvez pas écrivez simplement user.username . Vous devez utiliser :

DELETE FROM database_userprofile
USING "user"
WHERE database_userprofile.user_id = "user".id
AND "user".username = 'fred';

Vous remarquerez que j'ai mis "utilisateur" entre guillemets. C'est parce qu'il s'agit d'un mot-clé et qu'il ne devrait pas vraiment être utilisé pour les noms de table ou d'autres identifiants définis par l'utilisateur. Le double guillemet force à l'interpréter comme un identifiant et non comme un mot-clé.