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

Chèn các bản ghi tự tham chiếu trong Postgresql

Bạn có thể chọn last_value từ chuỗi, được tạo tự động khi bạn sử dụng loại serial:

create table test (
  id serial primary key,
  parent integer not null,
  foreign key (parent) references test(id)
);

insert into test values(default, (select last_value from test_id_seq));
insert into test values(default, (select last_value from test_id_seq));
insert into test values(default, (select last_value from test_id_seq));

select * from test;
 id | parent
----+--------
  1 |      1
  2 |      2
  3 |      3
(3 rows)

Và điều đơn giản hơn sau đây dường như cũng hoạt động:

insert into test values(default, lastval());

Mặc dù tôi không biết điều này sẽ hoạt động như thế nào khi sử dụng nhiều chuỗi ... tôi đã tìm kiếm nó; lastval () trả về giá trị cuối cùng được trả về hoặc được đặt với lệnh gọi nextval hoặc setval cuối cùng cho bất kỳ chuỗi nào, vì vậy, những điều sau sẽ khiến bạn gặp rắc rối:

create table test (
  id serial primary key,
  foo serial not null,
  parent integer not null,
  foreign key (parent) references test(id)
);

select setval('test_foo_seq', 100);

insert into test values(default, default, lastval());
ERROR:  insert or update on table "test" violates foreign key constraint "test_parent_fkey"
DETAIL:  Key (parent)=(101) is not present in table "test".

Tuy nhiên, những điều sau sẽ ổn:

insert into test values(default, default, currval('test_id_seq'));

select * from test;
 id | foo | parent
----+-----+--------
  2 | 102 |      2
(1 row)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm kiếm / truy vấn không phân biệt chữ hoa chữ thường

  2. Cách chuyển mảng kiểu tùy chỉnh vào hàm Postgres

  3. SQL - tính toán ngày kết thúc từ một ngày bắt đầu nhất định với các dấu ngắt tùy ý

  4. Làm cách nào để lấy (các) khóa chính của bảng từ Postgres qua plpgsql?

  5. Tự động tạo siêu người dùng với mỗi giản đồ django