PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chèn vào SQL postgres

Đừ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 đề.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhà cung cấp dịch vụ đám mây chuyên sâu:PostgreSQL trên AWS Aurora

  2. Cách thay đổi người dùng thành Superuser trong PostgreSQL

  3. Làm thế nào để đặt psql trên đường dẫn khi sử dụng Postgres.app trên OS X?

  4. Sao chép cấu trúc bảng vào bảng mới

  5. Các ký tự này có hợp lệ cho XML không?