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

Trả lại nhiều giá trị SERIAL từ chèn hàng loạt Posgtres

Bạn có thể sử dụng RETURNING với nhiều giá trị:

psql=> create table t (id serial not null, x varchar not null);
psql=> insert into t (x) values ('a'),('b'),('c') returning id;
 id 
----
  1
  2
  3
(3 rows)

Vì vậy, bạn muốn một cái gì đó giống như thế này:

INSERT INTO AutoKeyEntity (Name,Description,EntityKey) VALUES
('AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a','Testing 5/4/2011 8:59:43 AM',DEFAULT)
returning EntityKey;
INSERT INTO AutoKeyEntityListed (EntityKey,Listed,ItemIndex) VALUES
(CURRVAL('autokeyentity_entityKey_seq'),'Test 1 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 0),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 2 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 1),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 3 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 2)
returning EntityKey;
-- etc.

Và sau đó bạn sẽ phải thu thập EntityKey đã trả về giá trị từ mỗi câu lệnh trong giao dịch của bạn.

Bạn có thể cố gắng lấy giá trị hiện tại của trình tự khi bắt đầu và kết thúc giao dịch và sử dụng các giá trị đó để tìm ra giá trị trình tự nào đã được sử dụng nhưng that không đáng tin cậy :

Vì vậy, ngay cả khi chuỗi của bạn có bộ nhớ cache của một giá trị mà bạn vẫn có thể có các giá trị trình tự không liền nhau trong giao dịch của mình. Tuy nhiên, bạn có thể an toàn nếu bộ nhớ cache của trình tự giá trị khớp với số INSERT trong giao dịch của bạn nhưng tôi đoán rằng điều đó sẽ quá lớn để có ý nghĩa.

CẬP NHẬT :Tôi chỉ nhận thấy (nhờ nhận xét của người hỏi) rằng có hai bảng liên quan, hơi bị lạc trong bức tường văn bản.

Trong trường hợp đó, bạn có thể sử dụng INSERTS hiện tại:

INSERT INTO AutoKeyEntity (Name,Description,EntityKey) VALUES
('AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a','Testing 5/4/2011 8:59:43 AM',DEFAULT)
returning EntityKey;
INSERT INTO AutoKeyEntityListed (EntityKey,Listed,ItemIndex) VALUES
(CURRVAL('autokeyentity_entityKey_seq'),'Test 1 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 0),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 2 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 1),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 3 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 2);
-- etc.

Và lấy EntityKey từng giá trị một từ INSERTs trên AutoEntityKey . Có thể cần một số loại tập lệnh để xử lý các giá trị RETURNING. Bạn cũng có thể bọc AutoKeyEntityAutoKeyEntityListed có liên quan CHÈN trong một hàm, sau đó sử dụng INTO để lấy EntityKey giá trị và trả về nó từ hàm:

INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PSQLException:ERROR:lỗi cú pháp trong tsquery

  2. postgresql:Tại sao tôi phải chỉ định -h localhost khi chạy psql?

  3. Lỗi cú pháp tại hoặc gần người dùng khi thêm ràng buộc Postgres

  4. Làm cách nào để bạn kết nối với Cơ sở dữ liệu Postgres mà không cần mật khẩu bằng pg-promise?

  5. Cách liệt kê các loại tùy chỉnh bằng Postgres information_schema