Saya punya tabel di PostgreSQL dengan 22 kolom, dan saya ingin menambahkan auto increment primary key.
Saya mencoba untuk membuat sebuah kolom bernama id
jenis BIGSERIAL tapi pgadmin menjawab dengan kesalahan:
ERROR: sequence must have same owner as table it is linked to.
Tidak ada yang tahu bagaimana untuk memperbaiki masalah ini? Bagaimana cara menambahkan membuat auto-incrementing kunci utama dalam PostgreSQL tanpa menciptakan meja lagi?
Langkah 1, buat tabel:
CREATE TABLE epictable
(
mytable_key serial primary key,
moobars VARCHAR(40) not null,
foobars DATE
);
Langkah 2, masukkan nilai-nilai ke meja anda seperti ini, perhatikan bahwa mytable_key tidak ditentukan di parameter pertama daftar, hal ini menyebabkan default urutan ke 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 meja anda:**
el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"
Langkah 4, menafsirkan output:
mytable_key | moobars | foobars
-------------+-----------------------+------------
1 | delicious moobars | 2012-05-01
2 | world wide interblags | 2012-05-02
(2 rows)
Mengamati bahwa mytable_key kolom telah otomatis bertambah.
Catatan:
Anda harus selalu menggunakan primary key pada tabel karena postgresql internal menggunakan hash table struktur untuk meningkatkan kecepatan menyisipkan, menghapus, update dan memilih. Jika sebuah primary key kolom (yang dipaksa unik dan non-null) tersedia, hal ini dapat bergantung pada untuk menyediakan benih yang unik untuk fungsi hash. Jika tidak ada primary key adalah kolom yang tersedia, fungsi hash menjadi tidak efisien karena memilih beberapa kolom sebagai kunci.
Buat auto incrementing kunci utama dalam postgresql, menggunakan custom urutan:
Langkah 1, membuat urutan:
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, membuat meja anda
CREATE TABLE splog_adfarm
(
splog_key INT unique not null,
splog_value VARCHAR(100) not null
);
Langkah 3, masukkan ke meja 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, mengamati deretan
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 tombol yang dimulai dari 1 dan bertambah 1, seperti yang didefinisikan oleh urutan.
Bonus Elit ProTip:
Programmer benci mengetik, dan mengetik nextval('splog_adfarm_seq')
menjengkelkan. Anda dapat mengetik DEFAULT
untuk parameter yang sebaliknya, seperti ini:
insert into splog_adfarm values (
DEFAULT,
'Sufficient intelligence to outwit a thimble.'
);
Untuk di atas untuk bekerja, anda harus mendefinisikan nilai default untuk kolom kunci pada splog_adfarm meja. Yang lebih cantik.
Jika anda ingin melakukan hal ini di pgadmin, itu jauh lebih mudah. Tampaknya di postgressql, untuk menambahkan auto increment untuk satu kolom, pertama kita perlu membuat auto increment urutan dan menambahkannya ke kolom yang wajib diisi. Aku memang seperti ini.
2)Kemudian tambahkan urutan dengan mengklik kanan pada urutan-> tambahkan urutan baru. Jika tidak ada data dalam tabel, meninggalkan urutan seperti itu, don't membuat perubahan apapun. Simpan saja. Jika ada data-data yang ada, menambah terakhir atau nilai tertinggi dalam key primer kolom untuk nilai Saat ini dalam Definisi tab seperti yang ditunjukkan di bawah ini.
3)Akhirnya, tambahkan baris nextval('your_sequence_name'::regclass)
dengan nilai Default pada primary key seperti yang ditunjukkan di bawah ini.
Pastikan urutan nama yang benar di sini. Ini adalah semua dan auto increment harus bekerja.
Jika anda ingin menggunakan angka-angka dalam urutan, menentukan urutan baru dengan sesuatu seperti
CREATE SEQUENCE public.your_sequence
INCREMENT 1
START 1
MINVALUE 1
;
dan kemudian mengubah tabel untuk menggunakan urutan untuk id:
ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
Mungkin aku'm sedikit terlambat untuk menjawab pertanyaan ini, tapi aku'm bekerja pada subjek ini di pekerjaan saya :)
Aku ingin menulis kolom 'a_code' = c1,c2,c3,c4...
Pertama-tama saya membuka kolom dengan nama ref_id
dan ketik seri
.
Kemudian saya memecahkan masalah saya dengan perintah ini:
update myschema.mytable set a_code=cast('c'||"ref_id" as text)
Saya telah mencoba script berikut untuk berhasil auto increment primary key dalam 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)
);