Jak ustawić klucz podstawowy automatycznego przyrostu w PostgreSQL?


259

Mam tabelę w PostgreSQL z 22 kolumnami i chcę dodać klucz podstawowy automatycznego przyrostu.

Próbowałem utworzyć kolumnę idtypu BIGSERIAL, ale pgadmin odpowiedział błędem:

ERROR: sequence must have same owner as table it is linked to.

Czy ktoś wie, jak rozwiązać ten problem? Jak dodać utworzyć autokrementujący klucz podstawowy w PostgreSQL bez ponownego tworzenia tabeli?

Odpowiedzi:


292

Wypróbuj to polecenie:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Wypróbuj z tym samym użytkownikiem DB, który utworzyłeś tabelę.


75
(kluczem tutaj jest użycie typu danych SERIAL lub BIGSERIAL, który tworzy sekwencję za scenami i zwiększa / wykorzystuje ją w czasie wstawiania)
rogerdpack 30.04-14

16
a jeśli chcesz odwołać się do niego z innej tabeli, użyj liczby całkowitej lub biginta
Ward

2
@satishkilari: tak, składnia jest ALTER TABLE mytable ADD PRIMARY KEY (column);. Postgresql sprawdzi, czy kolumna nie zawiera wartości NULL.
AH

3
Uzyskiwanie tego błędu w pgAdmin 4. Zarówno bigseriali serialdają ten sam błąd:ERROR: syntax error at or near "BIGSERIAL"
adi

5
Otrzymuję również błąd składniowy przy użyciu bigserial lub serial. Czy istnieje dla tego minimalna wersja postgresql?
dacDave,

251

Automatyczne zwiększanie klucza podstawowego w postgresql:

Krok 1, stwórz swój stół:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

Krok 2, wstaw wartości do tabeli w ten sposób, zauważ, że klucz mytable_ nie jest określony na liście pierwszych parametrów, powoduje to automatyczne zwiększenie wartości domyślnej sekwencji.

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

Krok 3, wybierz * ze stołu:

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

Krok 4, zinterpretuj wynik:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

Zauważ, że kolumna mytable_key została automatycznie zwiększona.

Porada:

Zawsze powinieneś używać klucza podstawowego na stole, ponieważ postgresql wewnętrznie używa struktur tabeli mieszających, aby zwiększyć szybkość wstawiania, usuwania, aktualizacji i selekcji. Jeśli dostępna jest kolumna klucza podstawowego (która jest wymuszona jako unikatowa i nie jest pusta), można na niej polegać, aby zapewnić unikalne ziarno dla funkcji skrótu. Jeśli kolumna klucza podstawowego nie jest dostępna, funkcja skrótu staje się nieefektywna, gdy wybiera inny zestaw kolumn jako klucz.


21
Drobny nitpick, SERIALtworzy sequencekulisy: postgresql.org/docs/9.2/static/…
carbocation

1
czy można zrobić klucz podstawowy (istniejącą kolumnę) w tabeli bez dodawania nowej kolumny
satish kilari

czy klucz obcy zadeklarowany z thing_id int references epictable(mytable_key)pracą?

36

Utwórz automatycznie zwiększający klucz podstawowy w postgresql, korzystając z niestandardowej sekwencji:

Krok 1, utwórz sekwencję:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

Krok 2, stwórz swój stół

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

Krok 3, włóż do stołu

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

Krok 4, obserwuj rzędy

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

Dwa rzędy mają klucze, które zaczynają się od 1 i są zwiększane o 1, zgodnie z sekwencją.

Bonus Elite ProTip:

Programiści nie znoszą pisania, a pisanie nextval('splog_adfarm_seq')jest denerwujące. Zamiast tego możesz wpisać DEFAULTten parametr:

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

Aby powyższe zadziałało, musisz zdefiniować domyślną wartość dla tej kolumny klucza w tabeli splog_adfarm. Co jest ładniejsze.


2
Jakie są zalety niestandardowych sekwencji? Prawdopodobnie bezpieczeństwo?
Léo Léopold Hertz -

1
@Masi Jednym z zastosowań niestandardowej sekwencji może być ułatwienie replikacji master-master - co byłoby przydatne, jeśli połączenie danych między dwoma centrami danych jest zerwane - umożliwiając tworzenie rekordów na obu serwerach o różnych identyfikatorach, które ułatwia synchronizację baz danych, zachowując identyfikatory wygenerowane w osobnych lokalizacjach.
Vincent McNabb,

16

Jeśli chcesz to zrobić w pgadmin, jest to o wiele łatwiejsze. Wydaje się, że w postgressql, aby dodać automatyczny przyrost do kolumny, najpierw musimy utworzyć sekwencję automatycznego przyrostu i dodać ją do wymaganej kolumny. Podobało mi się

1) Najpierw musisz upewnić się, że jest klucz podstawowy do twojego stołu. Zachowaj także typ danych klucza podstawowego w bigint lub smallint. (Użyłem biginta, nie mogłem znaleźć typu danych o nazwie serial, jak wspomniano w innych odpowiedziach gdzie indziej)

2) Następnie dodaj sekwencję, klikając prawym przyciskiem myszy sekwencję-> dodaj nową sekwencję . Jeśli w tabeli nie ma danych, pozostaw tę sekwencję bez zmian, nie wprowadzaj żadnych zmian. Po prostu to zapisz. Jeśli istnieją dane, dodaj ostatnią lub najwyższą wartość w kolumnie klucza podstawowego do bieżącej wartości w zakładce Definicje, jak pokazano poniżej. wprowadź opis zdjęcia tutaj

3) Na koniec dodaj linię nextval('your_sequence_name'::regclass)do wartości domyślnej w kluczu podstawowym, jak pokazano poniżej.

wprowadź opis zdjęcia tutaj Upewnij się, że nazwa sekwencji jest tutaj poprawna. To wszystko i automatyczny przyrost powinien działać.


9

Jeśli chcesz używać liczb w sekwencji, zdefiniuj nową sekwencję za pomocą czegoś podobnego

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

a następnie zmień tabelę, aby użyć sekwencji dla identyfikatora:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);

Czy muszę utworzyć nową sekwencję dla każdego stołu?
Bharat Chhabra

Możesz udostępnić tę samą sekwencję dla różnych tabel, ale sekwencja wzrośnie dla każdego rekordu w każdej tabeli.
acaruci

1

Próbowałem następującego skryptu, aby pomyślnie automatycznie zwiększyć klucz podstawowy w PostgreSQL.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);

EDYTOWAĆ:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

Słowo kluczowe SERIAL automatycznie tworzy sekwencję dla odpowiedniej kolumny.


Czy jednak możesz zresetować SERIAL tak, jak robisz to dla SEKWENCJI?
toroc

1
Tak !, sprawdziłem ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;i działa.
Asad Shakeel

0

Może trochę spóźniłem się z odpowiedzią na to pytanie, ale pracuję nad tym tematem w mojej pracy :)

Chciałem napisać kolumnę „a_code” = c1, c2, c3, c4 ...

Najpierw otworzyłem kolumnę z nazwą ref_idi typem serial. Następnie rozwiązałem problem z tym poleceniem:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 

czy można zrobić klucz podstawowy (istniejącą kolumnę) w tabeli bez dodawania nowej kolumny
satish kilari
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.