sql >> Databáze >  >> RDS >> PostgreSQL

GeneratedValue v Postgresu

Myslím, že přijatá odpověď od Petara není správná nebo již není správná. Automatické zvýšení v Postgresu je řešeno pomocí SERIAL pseudo typ, to je pravda. Mapování, které poskytuje Petar, však povede k následujícímu DDL generovanému Hibernate 5.1:

CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;

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

Toto nepoužívá SERIAL , ale řízená sekvence Hibernate. Není ve vlastnictví tabulky a nebyla nastavena žádná výchozí hodnota. Generování DDL je samozřejmě funkce, kterou mnoho lidí v produkci nepoužívá (ale mnozí berou vygenerovaný kód jako šablonu).

Pokud svůj DDL napíšete ručně a skutečně použijete SERIAL a poté pomocí GenerationType.SEQUENCE může dokonce být v konfliktu s chováním databáze. Správný způsob mapování Hibernate pomocí preferované strategie ID Postgres je použití GenerationType.IDENTITY . Mimochodem, kód je také mnohem kratší a čitelnější:

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


  1. Resetujte primární klíč PostgreSQL na 1

  2. Rozdíl mezi databází a schématem

  3. Jak třídit v SQL

  4. Pochopení indexů v MySQL:Část druhá