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

Valeur générée dans Postgres

Je pense que la réponse acceptée de Petar n'est pas correcte, ou n'est plus correcte. L'auto-incrémentation dans Postgres est gérée via SERIAL pseudo type, c'est correct. Cependant, le mappage fourni par Petar entraînera le DDL suivant généré par Hibernate 5.1 :

CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;

CREATE TABLE … (
    id INT8 NOT NULL,
    …
);

Ceci n'utilise pas SERIAL , mais une séquence gérée par Hibernate. Il n'appartient pas à la table et aucune valeur par défaut n'a été définie. Bien sûr, la génération DDL est une fonctionnalité que beaucoup de gens n'utilisent pas en production (mais beaucoup prennent le code généré comme modèle).

Si vous écrivez à la main votre DDL et que vous avez réellement utilisé SERIAL , puis en utilisant GenerationType.SEQUENCE peut même entrer en conflit avec le comportement de la base de données. La bonne façon de mapper Hibernate avec la stratégie d'identification préférée de Postgres est d'utiliser GenerationType.IDENTITY . Incidemment, le code est également beaucoup plus court et plus lisible :

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;