Jangan lakukan itu! PERNAH ! Jangan pernah berpikir untuk melakukan itu!
Ini SALAH solusi tampaknya (tidak) bekerja untuk Anda:
INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');
TAPI , jika seseorang mencoba memasukkan pada saat yang sama dengan Anda, Anda berdua akan mendapatkan id
yang sama , yang akan menyebabkan hasil yang tidak valid. Anda benar-benar harus menggunakan sequence
atau beberapa mekanisme yang lebih andal (tabel bantu adalah umum ketika Anda tidak dapat memiliki lubang dalam urutan, tetapi memiliki beberapa kelemahan [itu akan mengunci]). Anda bahkan dapat menggunakan serial
tipe data untuk membuatnya lebih mudah (membuat urutan di bawahnya):
CREATE TABLE lists(id serial, col2 text, col3 text, ...);
-- If you don't specify "id", it will autogenerate for you:
INSERT INTO lists(col2, col3, ...) VALUES('KO','SPH', ...);
-- You can also specify using DEFAULT (the same as above):
INSERT INTO lists(id, col2, col3, ...) VALUES(DEFAULT, 'KO','SPH', ...);
Jika Anda benar-benar, BENAR-BENAR, tidak dapat membuat dan menggunakan urutan, Anda dapat melakukan seperti di atas, tetapi Anda harus menangani pengecualian (dengan asumsi id
bidangnya adalah PK atau UK, dan menggunakan transaksi berkomitmen baca), sesuatu seperti itu (dalam PL/pgSQL):
DECLARE
inserted bool = false;
BEGIN
WHILE NOT inserted LOOP;
BEGIN
INSERT INTO lists
VALUES ((SELECT coalesce(max(id),0)+1 FROM lists),'KO','SPH', '5');
inserted = true;
EXCEPTION
WHEN unique_violation THEN
NULL; -- do nothing, just try again
END;
END LOOP;
END;
Tapi sekali lagi, saya sangat menyarankan Anda untuk menghindarinya:gunakan urutan dan bahagia... =D
Juga, saya tahu ini adalah contoh, tetapi gunakan daftar kolom eksplisit di INSERT INTO
klausa.