【问题标题】:Postgres before insert trigger using sequence from another table使用另一个表中的序列插入触发器之前的 Postgres
【发布时间】:2015-03-26 18:30:07
【问题描述】:

使用 Postgres,我想要实现的是能够拥有许多不同的仪器类型,以及对应的 [TYPE].instrument 表,它们在表中都有唯一的 ID,而且在 @987654322 中也引用了唯一的 ID @ 桌子。我有以下内容:

create schema instrument

CREATE TABLE instrument.type (
    id smallserial NOT NULL,
    name text not null,
    code text not null,
    CONSTRAINT pk_instrument_type PRIMARY KEY (id)
);
ALTER TABLE instrument.type ADD CONSTRAINT unq_instrument_type_code UNIQUE(code);
ALTER TABLE instrument.type ADD CONSTRAINT unq_instrument_type_name UNIQUE(name);

insert into instrument.type (name, code) values ('futures', 'f');

CREATE TABLE instrument.master (
    id serial NOT NULL,
    type smallint not null references instrument.type (id),
    timestamp timestamp with time zone not null,
    CONSTRAINT pk_instrument_master PRIMARY KEY (id)
);

CREATE TABLE futures.definition (
    id smallserial NOT NULL,
    code text not null,
    CONSTRAINT pk_futures_definition PRIMARY KEY (id)
);
ALTER TABLE futures.definition ADD CONSTRAINT unq_futures_definition_code UNIQUE(code);

insert into futures.definition (code) values ('ED');

CREATE TABLE futures.instrument (
    id smallserial NOT NULL,
    master serial not null references instrument.master (id),
    definition smallint not null references futures.definition (id),
    month smallint not null,
    year smallint not null,
    CONSTRAINT pk_futures_instrument PRIMARY KEY (id),
    check (month >= 1),
    check (month <= 12),
    check (year >= 1900)
);

ALTER TABLE futures.instrument ADD CONSTRAINT unq_futures_instrument UNIQUE(definition, month, year);

CREATE OR REPLACE FUNCTION trigger_master_futures()
RETURNS trigger AS
$BODY$
BEGIN
    insert into instrument.master (type, timestamp)
    select id, current_timestamp from instrument.type where code = 'f';
    NEW.master := currval('instrument.master_id_seq');

    RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

create trigger trg_futures_instrument before insert on futures.instrument
for each row
execute procedure trigger_master_futures();

然后我测试:

insert into futures.instrument (definition, month, year)
select id, 3, 2015 from futures.definition where code = 'ED';

一切都几乎如我所愿。唯一的问题是,不知何故,instrument.master.id 最终比futures.instrument.master 多一个。我不确定我需要做什么来实现我想要的行为,即每当一个条目插入futures.instrument时,一个条目应该插入instrument.master,而后者的id条目应该是插入到前者的master 条目中。我实际上认为它应该失败,因为外键关系被某种方式违反了。

【问题讨论】:

    标签: postgresql triggers sql-insert


    【解决方案1】:

    事实证明,一切都是正确的。问题是在futures.instrument中,主列的类型是serial,应该是int

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-25
      • 2015-02-14
      • 2021-04-26
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多