【问题标题】:Auto increment one column of a 3-column composite primary key in postgresql table在 postgresql 表中自动增加 3 列复合主键的一列
【发布时间】:2020-05-20 16:09:39
【问题描述】:

我有三列作为 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_dummy_table" 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                 ......

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

在插入期间,我将为前两列提供数据,而第三列必须自动递增,如上所示和解释?我该怎么做?

【问题讨论】:

  • 您可以根据需要使用触发器。
  • 我不知道怎么写触发器。你能写出来并回答我的问题@AkhileshMishra 吗?
  • 发布了触发器

标签: postgresql sql-insert


【解决方案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();

【讨论】:

  • 我现在有一个疑问。在这个触发器之后,我不能在INSERT 语句中为primary_key_three 指定值吗?它会毫无问题地执行吗?
  • 如果您为列primary_key_three 指定值,触发器将根据其逻辑覆盖它。如果您不提供列的值,它将添加 primary_key_three 的值
  • 我的意思是问,在此之后不要指定 primary_key_three 列名,也不能证明它的任何价值,例如火灾示例:INSERT INTO food_index_directory (primary_key_one, primary_key_two, varchar_column_one, numeric_column_one, numeric_column_two, numeric_column_three VALUES (value1, value2,,,,,,,);
  • 感谢您的快速响应。
  • 不,"fn_trig_pk"() 可以替换为 "schema_name"."trigger_name"RETURNS "pg_catalog"."trigger"你必须保持原样。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
相关资源
最近更新 更多