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

Trình tự PostgreSQL dựa trên một cột khác

Không vấn đề gì! Chúng ta sẽ tạo hai bảng, thingsstuff . stuff sẽ là bảng bạn mô tả trong câu hỏi của mình và things là cái mà nó đề cập đến:

CREATE TABLE things (
    id serial primary key,
    name text
);

CREATE TABLE stuff (
    id integer references things,
    seq integer NOT NULL,
    notes text,
    primary key (id, seq)
);

Sau đó, chúng tôi sẽ đặt things với một trình kích hoạt sẽ tạo một chuỗi mới mỗi khi một hàng được tạo:

CREATE FUNCTION make_thing_seq() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
begin
  execute format('create sequence thing_seq_%s', NEW.id);
  return NEW;
end
$$;

CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE make_thing_seq();

Bây giờ chúng ta sẽ kết thúc với thing_seq_1 , thing_seq_2 , v.v., v.v.

Giờ đây, một trình kích hoạt khác trên stuff để nó sử dụng đúng trình tự mỗi lần:

CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
begin
  NEW.seq := nextval('thing_seq_' || NEW.id);
  RETURN NEW;
end
$$;

CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();

Điều đó sẽ đảm bảo rằng khi các hàng đi vào stuff , id cột được sử dụng để tìm trình tự phù hợp để gọi nextval trên.

Đây là một minh chứng:

test=# insert into things (name) values ('Joe');
INSERT 0 1
test=# insert into things (name) values ('Bob');
INSERT 0 1
test=# select * from things;
 id | name
----+------
  1 | Joe
  2 | Bob
(2 rows)

test=# \d
              List of relations
 Schema |     Name      |   Type   |  Owner
--------+---------------+----------+----------
 public | stuff         | table    | jkominek
 public | thing_seq_1   | sequence | jkominek
 public | thing_seq_2   | sequence | jkominek
 public | things        | table    | jkominek
 public | things_id_seq | sequence | jkominek
(5 rows)

test=# insert into stuff (id, notes) values (1, 'Keychain');
INSERT 0 1
test=# insert into stuff (id, notes) values (1, 'Pet goat');
INSERT 0 1
test=# insert into stuff (id, notes) values (2, 'Family photo');
INSERT 0 1
test=# insert into stuff (id, notes) values (1, 'Redundant lawnmower');
INSERT 0 1
test=# select * from stuff;
 id | seq |        notes
----+-----+---------------------
  1 |   1 | Keychain
  1 |   2 | Pet goat
  2 |   1 | Family photo
  1 |   3 | Redundant lawnmower
(4 rows)

test=#


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hạn chế tên cột bảng Postgres?

  2. Ràng buộc kiểm tra PostgreSQL cho điều kiện khóa ngoại

  3. Làm cách nào để tạo tiện ích mở rộng postgres bên trong vùng chứa?

  4. PostGIS Đang hoạt động

  5. Khắc phục “LỖI:mỗi truy vấn UNION phải có cùng số cột” trong PostgreSQL