Bagaimana cara mengatur kunci primer kenaikan otomatis di PostgreSQL?

259

Saya punya tabel di PostgreSQL dengan 22 kolom, dan saya ingin menambahkan kunci primer kenaikan otomatis.

Saya mencoba membuat kolom bernama idtipe BIGSERIAL tetapi pgadmin merespons dengan kesalahan:

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

Adakah yang tahu cara memperbaiki masalah ini? Bagaimana cara menambahkan kunci primer penambahan otomatis di PostgreSQL tanpa membuat ulang tabel lagi?

mkn
sumber

Jawaban:

292

Coba perintah ini:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Cobalah dengan pengguna-DB yang sama dengan yang Anda buat tabel.

AH
sumber
75
(kuncinya di sini adalah menggunakan tipe data SERIAL atau BIGSERIAL, yang menciptakan urutan di belakang layar dan menambah / menggunakannya pada waktu memasukkan)
rogerdpack
16
dan jika Anda ingin referensi dari tabel lain, gunakan integer, atau bigint
Ward
2
@satishkilari: ya, sintaksnya adalah ALTER TABLE mytable ADD PRIMARY KEY (column);. Postgresql akan memeriksa bahwa kolom tersebut tidak mengandung NULL.
AH
3
Mendapatkan kesalahan ini di pgAdmin 4. Keduanya bigserialdan serialmemberikan kesalahan yang sama:ERROR: syntax error at or near "BIGSERIAL"
adi
5
Juga mendapatkan kesalahan sintaks menggunakan serial atau serial. Apakah ada minimum postgresql verison untuk ini?
dacDave
251

Menambahkan kunci primer otomatis di postgresql:

Langkah 1, buat tabel Anda:

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

Langkah 2, masukkan nilai ke dalam tabel Anda seperti ini, perhatikan bahwa mytable_key tidak ditentukan dalam daftar parameter pertama, ini menyebabkan urutan default menjadi autoincrement.

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

Langkah 3, pilih * dari tabel Anda:

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

Langkah 4, interpretasikan hasilnya:

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

Perhatikan bahwa kolom mytable_key telah ditambahkan secara otomatis.

ProTip:

Anda harus selalu menggunakan kunci utama di meja Anda karena postgresql secara internal menggunakan struktur tabel hash untuk meningkatkan kecepatan menyisipkan, menghapus, memperbarui dan memilih. Jika kolom kunci utama (yang dipaksa unik dan non-null) tersedia, itu bisa diandalkan untuk menyediakan seed unik untuk fungsi hash. Jika tidak ada kolom kunci utama yang tersedia, fungsi hash menjadi tidak efisien karena memilih beberapa set kolom lainnya sebagai kunci.

Eric Leschinski
sumber
21
Sebuah nitpick kecil, SERIALtidak membuat di sequencebelakang layar: postgresql.org/docs/9.2/static/…
carbocation
1
apakah mungkin membuat kunci primer (kolom yang ada) dalam sebuah tabel tanpa menambahkan kolom baru
satish kilari
akankah kunci asing dideklarasikan dengan thing_id int references epictable(mytable_key)berfungsi?
36

Buat kunci primer tambahan otomatis di postgresql, menggunakan urutan khusus:

Langkah 1, buat urutan Anda:

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

Langkah 2, buat tabel Anda

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

Langkah 3, masukkan ke tabel Anda

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!'
);

Langkah 4, amati baris

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)

Dua baris memiliki kunci yang mulai dari 1 dan bertambah 1, seperti yang didefinisikan oleh urutan.

Bonus Elite ProTip:

Pemrogram benci mengetik, dan mengetik nextval('splog_adfarm_seq')itu mengganggu. Anda bisa mengetikkan DEFAULTparameter itu, seperti ini:

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

Agar hal di atas berfungsi, Anda harus menetapkan nilai default untuk kolom kunci pada tabel splog_adfarm. Yang lebih cantik.

Eric Leschinski
sumber
2
Apa manfaat dari urutan khusus? Mungkin, keamanan?
Léo Léopold Hertz 준영
1
@Masi Salah satu penggunaan urutan kustom bisa untuk membuatnya lebih mudah untuk melakukan replikasi master-master - yang akan berguna jika hubungan data antara dua pusat data rusak - memungkinkan catatan dibuat di kedua server dengan ID yang berbeda, yang kemudian membuatnya mudah untuk menyinkronkan kembali basis data sambil menjaga id yang dihasilkan di lokasi yang terpisah.
Vincent McNabb
16

Jika Anda ingin melakukan ini di pgadmin, itu jauh lebih mudah. Tampaknya dalam postgressql, untuk menambahkan kenaikan otomatis ke kolom, pertama-tama kita harus membuat urutan kenaikan otomatis dan menambahkannya ke kolom yang diperlukan. Saya memang suka ini.

1) Pertama, Anda perlu memastikan ada kunci utama untuk tabel Anda. Juga simpan tipe data kunci utama dalam bigint atau smallint. (Saya menggunakan bigint, tidak dapat menemukan datatype yang disebut serial sebagaimana disebutkan dalam jawaban lain di tempat lain)

2) Kemudian tambahkan urutan dengan mengklik kanan pada urutan-> tambahkan urutan baru . Jika tidak ada data di tabel, biarkan urutannya seperti itu, jangan buat perubahan apa pun. Simpan saja. Jika ada data yang ada, tambahkan nilai terakhir atau tertinggi di kolom kunci utama ke nilai Sekarang di tab Definisi seperti yang ditunjukkan di bawah ini. masukkan deskripsi gambar di sini

3) Akhirnya, tambahkan baris nextval('your_sequence_name'::regclass)ke nilai Default di kunci utama Anda seperti yang ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini Pastikan nama urutannya benar di sini. Ini semua dan peningkatan otomatis harus berfungsi.

toing_toing
sumber
9

Jika Anda ingin menggunakan angka dalam urutan, tentukan urutan baru dengan sesuatu seperti

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

dan kemudian ubah tabel untuk menggunakan urutan untuk id:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
acaruci
sumber
Apakah saya harus membuat urutan baru untuk setiap tabel?
Bharat Chhabra
Anda bisa berbagi urutan yang sama untuk tabel yang berbeda, tetapi urutan tersebut akan meningkat untuk setiap catatan di setiap tabel.
acaruci
1

Saya telah mencoba skrip berikut untuk berhasil menambahkan secara otomatis kunci utama di 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)
);

EDIT:

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

Kata kunci SERIAL secara otomatis membuat urutan untuk masing-masing kolom.

Asad Shakeel
sumber
Bisakah Anda mengatur ulang SERIAL seperti yang Anda lakukan untuk SEQUENCE?
thoroc
1
Ya !, saya sudah memeriksa ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;dan berfungsi.
Asad Shakeel
0

Mungkin saya sedikit terlambat untuk menjawab pertanyaan ini, tetapi saya sedang mengerjakan hal ini di pekerjaan saya :)

Saya ingin menulis kolom 'a_code' = c1, c2, c3, c4 ...

Pertama saya membuka kolom dengan nama ref_iddan tipe serial. Lalu saya memecahkan masalah saya dengan perintah ini:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
pengguna5838061
sumber
apakah mungkin membuat kunci primer (kolom yang ada) dalam sebuah tabel tanpa menambahkan kolom baru
satish kilari