Saya punya tabel dengan data yang ada. Apakah ada cara untuk menambahkan kunci utama tanpa menghapus dan membuat ulang tabel?
190
Saya punya tabel dengan data yang ada. Apakah ada cara untuk menambahkan kunci utama tanpa menghapus dan membuat ulang tabel?
( Diperbarui - Terima kasih kepada orang-orang yang berkomentar )
Misalkan Anda memiliki tabel bernama test1
, yang ingin Anda tambahkan id
kolom penambahan-kunci, kunci utama (pengganti). Perintah berikut harus mencukupi di versi terbaru PostgreSQL:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Dalam versi PostgreSQL lama (sebelum 8.x?) Anda harus melakukan semua pekerjaan kotor. Urutan perintah berikut harus melakukan trik:
ALTER TABLE test1 ADD COLUMN id INTEGER;
CREATE SEQUENCE test_id_seq OWNED BY test1.id;
ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
UPDATE test1 SET id = nextval('test_id_seq');
Sekali lagi, dalam versi terbaru Postgres ini kira-kira sama dengan perintah tunggal di atas.
ADD PRIMARY KEY
juga menciptakanNOT NULL
kendala (diuji di postgres 9.3) seperti yang diharapkan dan diinginkan.ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Ini yang Anda butuhkan untuk:
id
kolomPenghargaan diberikan kepada @resnyanskiy yang memberikan jawaban ini dalam komentar.
sumber
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Untuk menggunakan kolom identitas di v10,
Untuk penjelasan tentang kolom identitas, lihat https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
Untuk perbedaan antara DIHASILKAN OLEH DEFAULT dan SELALU DIHASILKAN, lihat https://www.cybertec-postgresql.com/en/ followingences-gains-and-pitfalls / .
Untuk mengubah urutan, lihat https://popsql.io/learn-sql/postgresql/how-to-alter- berikutnyaence-in-postgresql/ .
sumber
SQL Error [23502]: ERROR: column "id" contains null values
Saya mendarat di sini karena saya mencari sesuatu seperti itu juga. Dalam kasus saya, saya menyalin data dari seperangkat tabel pementasan dengan banyak kolom menjadi satu tabel sementara juga menetapkan id baris ke tabel target. Berikut adalah varian dari pendekatan di atas yang saya gunakan. Saya menambahkan kolom serial di akhir tabel target saya. Dengan begitu saya tidak perlu memiliki placeholder untuk itu dalam pernyataan Sisipkan. Kemudian pilih * sederhana ke tabel target secara otomatis mengisi kolom ini. Berikut adalah dua pernyataan SQL yang saya gunakan pada PostgreSQL 9.6.4.
sumber