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

Comportement étrange dans Postgresql

Votre update_tbl_point la fonction fait probablement quelque chose comme ceci :

new.last_update = current_timestamp;

mais il devrait utiliser new."Last_Update" corrigez donc votre fonction de déclenchement.

Les noms de colonne sont normalisés en minuscules dans PostgreSQL (le contraire de ce que dit le standard SQL, remarquez) mais les identifiants qui sont entre guillemets doubles conservent leur casse :

Le fait de citer un identifiant le rend également sensible à la casse, tandis que les noms sans guillemets sont toujours pliés en minuscules. Par exemple, les identifiants FOO, foo et "foo" sont considérés comme identiques par PostgreSQL, mais "Foo" et "FOO" sont différents de ces trois et l'un de l'autre. (Le pliage des noms sans guillemets en minuscules dans PostgreSQL est incompatible avec la norme SQL, qui stipule que les noms sans guillemets doivent être pliés en majuscules. Ainsi, foo devrait être équivalent à "FOO" et non à "foo" selon la norme. Si vous voulez écrire des applications portables, il est conseillé de toujours citer un nom particulier ou de ne jamais le citer.)

Donc, si vous faites ceci :

create table pancakes (
    Eggs integer not null
)

alors vous pouvez faire n'importe laquelle de ces choses :

update pancakes set eggs = 11;
update pancakes set Eggs = 11;
update pancakes set EGGS = 11;

et cela fonctionnera car les trois formes sont normalisées en eggs . Cependant, si vous faites ceci :

create table pancakes (
    "Eggs" integer not null
)

alors vous pouvez faire ceci :

update pancakes set "Eggs" = 11;

mais pas ça :

update pancakes set eggs = 11;

La pratique habituelle avec PostgreSQL est d'utiliser partout des identifiants en minuscules afin que vous n'ayez pas à vous en soucier. Je recommanderais également le même schéma de dénomination dans d'autres bases de données, le fait de devoir tout citer vous laisse avec un gâchis de guillemets doubles (standard), de backticks (MySQL) et de crochets (SQL Server) dans votre SQL et cela ne sera pas te faire des amis.