在PostgreSQL表中自动增加3列复合主键的一列

问题描述 投票:1回答:1

我在PostgreSql数据库表中有三列作为复合主键。在插入查询中将提供两列的数据。但是,每次插入时,必须增加另一列。这是一个示例:

CREATE TABLE "food_index_directory" (
  "primary_key_one"          VARCHAR(6) NOT NULL,
  "primary_key_two"          NUMERIC(4) NOT NULL,
  "primary_key_three"        NUMERIC(5) NOT NULL,
  "varchar_column_one"       VARCHAR(30) NOT NULL,
  "numeric_column_one"       INTEGER NOT NULL,
  "numeric_column_two"       NUMERIC(12,9) DEFAULT .001 NOT NULL,
  "numeric_column_three"     NUMERIC(5,2),
  "last_upd_date"            DATE NOT NULL,
CONSTRAINT "PK_food_index_directory" PRIMARY KEY ("primary_key_one","primary_key_two","primary_key_three")
);

如上所述,两个主键列和另一个(primary_key_three)的数据必须根据第一和第二键列的出现次数来增加。第二个键列只能取1到12之间的值,此第三列是第二列的计数列。例如:

primary_key_one primary_key_two primary_key_three     ......
91                    1            1                 ......
91                    1            2                 ......
 91                    2            1                 ......
 91                    2            2                 ......
91                    1            3                 ......
 91                    2            3                 ......
  91                    3            1                 ......
 91                    2            4                 ......
  34                    3            1                 ......
91                    1            4                 ......
    91                   4            1                 ......
     91                   5            1                 ......
    34                   4            1                 ......

在上面的示例中,(为了更好地理解,当重复前两列的数据时,我留了一些空格,第三列计算该表中前两列重复的次数。

在插入过程中,我将为前两列提供数据,而第三列必须如上所述自动增加?我该怎么做?

postgresql sql-insert
1个回答
1
投票

查找步骤

CREATE OR REPLACE FUNCTION "fn_trig_pk"()
  RETURNS "pg_catalog"."trigger" AS $BODY$ 
begin
new.primary_key_three = (select count(*)+1 from food_index_directory where primary_key_one=new.primary_key_one and primary_key_two=new.primary_key_two );
return NEW;
end;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

并为您的表触发

CREATE TRIGGER trig_pk
  BEFORE insert 
  ON food_index_directory
  FOR EACH ROW
  EXECUTE PROCEDURE fn_trig_pk();
© www.soinside.com 2019 - 2024. All rights reserved.