Saya punya tabel yang dibuat dengan cara ini:
--
-- Table: #__content
--
CREATE TABLE "jos_content" (
"id" serial NOT NULL,
"asset_id" bigint DEFAULT 0 NOT NULL,
...
"xreference" varchar(50) DEFAULT '' NOT NULL,
PRIMARY KEY ("id")
);
Kemudian beberapa baris dimasukkan menentukan id:
INSERT INTO "jos_content" VALUES (1,36,'About',...)
Pada suatu titik kemudian beberapa catatan dimasukkan tanpa id dan mereka gagal dengan kesalahan:
Error: duplicate key value violates unique constraint
.
Rupanya id dapat didefinisikan sebagai urutan:
Setiap sisipan yang gagal meningkatkan penunjuk dalam urutan hingga meningkat ke nilai yang tidak ada lagi dan kueri berhasil.
SELECT nextval('jos_content_id_seq'::regclass)
Apa yang salah dengan definisi tabel? Apa cara cerdas untuk memperbaikinya?
postgresql
database-design
insert
auto-increment
sequence
Valentin Despa
sumber
sumber
Jawaban:
Tidak ada yang salah dengan definisi tabel Anda.
(Kecuali saya akan menggunakan
jos_content_id
sesuatu atau bukan nama kolom non-deskriptifid
.Dan saya mungkin akan menggunakan
text
bukanvarchar(50)
.INSERT
Pernyataan Anda adalah masalahnya.Dengan
id
kolom Anda didefinisikan sebagaiserial
, Anda tidak harus memasukkan nilai manual untukid
. Mereka mungkin bertabrakan dengan nilai berikutnya dari urutan terkait.Berikan daftar eksplisit kolom target (yang hampir selalu merupakan ide bagus untuk
INSERT
pernyataan tetap ) dan abaikan kolom serial sepenuhnya.Jika Anda membutuhkan nilai kolom yang dibuat secara otomatis segera, gunakan
RETURNING
klausa :Lebih detail dalam jawaban terkait ini di SO:
Jika Anda memiliki entri manual dalam
serial
kolom yang kekuatan konflik kemudian, mengatur urutan ke arus maksimumid
untuk memperbaiki ini sekali :Di mana
jos_content_id_seq
nama default untuk urutan yang dimiliki olehjos_content.id
, yang sudah Anda temukan di kolom default. Tampaknya adaxhzt8_content_id_seq
dalam kasus Anda;Pembaruan: Masalah serupa muncul pada SO dan saya datang dengan solusi baru:
sumber