Đừng làm vậy! BAO GIỜ ! Thậm chí đừng nghĩ đến việc làm điều đó!
Điều này SAI giải pháp có vẻ (nó không) hiệu quả với bạn:
INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');
NHƯNG , nếu ai đó cố gắng chèn cùng lúc với bạn, cả hai bạn sẽ nhận được cùng một id
, điều này sẽ gây ra kết quả không hợp lệ. Bạn thực sự nên sử dụng sequence
hoặc một số cơ chế đáng tin cậy hơn (một bảng bổ trợ thường gặp khi bạn không thể có lỗ trong trình tự, nhưng nó có một số nhược điểm [nó sẽ khóa]). Bạn thậm chí có thể sử dụng serial
kiểu dữ liệu để làm cho nó dễ dàng hơn (nó tạo ra một chuỗi bên dưới):
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', ...);
Nếu bạn thực sự, thực sự, THỰC SỰ, không thể tạo và sử dụng một chuỗi, bạn có thể làm như trên, nhưng bạn sẽ phải xử lý ngoại lệ (giả sử là id
trường là PK hoặc Vương quốc Anh và sử dụng giao dịch được cam kết đã đọc), tương tự như vậy (trong 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;
Nhưng một lần nữa, tôi thực sự khuyên bạn nên tránh nó:sử dụng một trình tự và vui vẻ ... =D
Ngoài ra, tôi biết đó là một ví dụ, nhưng hãy sử dụng danh sách cột rõ ràng trên INSERT INTO
mệnh đề.