2015-10-07 10 views
6

Używam Grails 3.0.7 i Postgres 9.2. Jestem całkiem nowy w Postgresie, więc to może być głupie pytanie. Jak poprawnie skojarzyć sekwencję generatora id z tabelą? Czytałem gdzieś, że jeśli utworzysz tabelę z kolumną id, która ma typ danych serial, automatycznie utworzy ona sekwencję dla tej tabeli.Jak poprawnie powiązać sekwencję generatora id z tabelą

Jednak kolumna wydaje się być utworzona z typem bigint. Jak mogę sprawić, by Grails utworzył kolumnę o typie danych bigserial i czy to rozwiąże nawet mój problem? Co jeśli chcę jedną sekwencję na stół? Po prostu nie jestem pewien, jak to ustawić, ponieważ nigdy wcześniej nie używałem PostgreSQL.

+0

To może być pomocne: http: // stackoverflow.com/questions/7580807/hibernate-postgresql-with-grails/7581050 # 7581050 –

+0

Dziękuję. To wydaje się generować sekwencję dla każdej tabeli, jak chcę, ale jak mam "dołączyć" ją do stołu? Kiedy patrzę na bazę danych, sekwencje są tam, ale nie widzę, w jaki sposób są one powiązane z ich odpowiednimi tabelami, a typ danych dla kolumn id jest wciąż bigintem. – cloudwalker

+0

Postępujesz zgodnie z powyższym łączem, a następnie używasz go jako dialektu w DataSource.groovy. – Neoryder

Odpowiedz

0

Jednakże kolumna wydaje się być utworzone z rodzaju bigint. W jaki sposób Dostaję Grailsa do utworzenia kolumny o typie danych bigserial, a czy będzie to rozwiązać nawet mój problem?

To oczekiwane zachowanie. Zdefiniuj kolumnę jako , którą musisz wykonać. Postgres'a pseudo typy danych smallserial, serial and bigserial utworzyć smallint, int lub bigint kolumny odpowiednio, dołączonego do specjalnego sekwencji. Dokumentacja:

Typy danych smallserial, serial i bigserial nie są prawdziwymi typy lecz jedynie Oznaczenia wygoda dla stworzenia unikalnego identyfikatora kolumny (podobne do właściwości AUTO_INCREMENT obsługiwanego przez niektórych innych baz danych). W obecnej implementacji, określając:

CREATE TABLE tablename (
    colname SERIAL 
); 

jest równoznaczne z określeniem:

CREATE SEQUENCE tablename_colname_seq; 
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') 
); 
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname; 

Big cytat, ponieważ nie mogę opisać to lepiej niż instrukcji już nie.

pokrewne:

+0

Hmm, ok, więc może coś jest nie tak z moją konfiguracją projektu Grails, ponieważ kolumna id nie kończy się posiadaniem odpowiedniej sekwencji. Pomyślałem, że może to po prostu coś, co Postgres dotyczy, ponieważ mam 0 doświadczenia z Postgresem. – cloudwalker

2

Można zdefiniować generator w klasie domeny tak:

static mapping = { 
    id generator:'sequence', params:[sequence:'domain_sq'] 
} 

Jeśli sekwencja jest już obecny w bazie danych, a następnie trzeba będzie wymienić go w params.

istnieją inne właściwości, dostępny także przedstawione w documentation, np

static mapping = { 
id column: 'book_id', type: 'integer' 
} 
Powiązane problemy