請參閱下面的答案和編輯#1。但是,觸發器在PetaPoco/Npgsql下仍然失敗。如何強制新記錄僅在PostgreSQL中有序列值?
我在這裏缺少一些基本的東西。我需要確保任何記錄添加到該表中的順序沒有給出只有。即使當insertno聲明本身提供了orderno時,也應該包含這些信息。也就是說,
insert into returntooffice (chart_recid, returndate, torder, **orderno**) values (14982,'2016-11-09','2017-12-4 00:21:42.553508', **0**);
和
insert into returntooffice (chart_recid, returndate, torder) values (14982,'2016-11-09','2017-12-4 00:21:42.553508');
應該既結果在接下來的orderno從序列,而不是0這是一個orderno,什麼是實際發生的是,提供正在插入orderno(0) - 不是下一個序列值(8000)。我在這裏使用了一個觸發器,因爲實際組成的插入是由一個不遵循列上的postgreSQL DEFAULT子句的ORM實現的。
下面是詳細信息:
CREATE TABLE returntooffice
(
recid serial NOT NULL,
orderno integer NOT NULL,
chart_recid integer NOT NULL,
returndate date,
torder timestamp without time zone NOT NULL DEFAULT now(),
modified timestamp without time zone DEFAULT now(),
return_as_needed boolean,
is_deferred boolean,
CONSTRAINT returntooffice_pk PRIMARY KEY (recid),
CONSTRAINT returntooffice_chart_fk FOREIGN KEY (chart_recid)
REFERENCES charts (recid) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT returntooffice_order_unqiue UNIQUE (orderno),
CONSTRAINT returntooffice_unqiue UNIQUE (chart_recid, torder)
)
WITH (
OIDS=FALSE
);
ALTER TABLE returntooffice
OWNER TO postgres;
CREATE TRIGGER get_next_order_number_trigger
BEFORE INSERT
ON returntooffice
FOR EACH ROW
EXECUTE PROCEDURE getnextorderno();
CREATE TRIGGER update_modified
BEFORE UPDATE
ON returntooffice
FOR EACH ROW
EXECUTE PROCEDURE update_modified();
CREATE SEQUENCE order_number_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 6558
CACHE 1;
ALTER TABLE order_number_seq
OWNER TO postgres;
CREATE OR REPLACE FUNCTION getnextorderno()
RETURNS trigger AS
$BODY$
BEGIN
NEW.orderno := nextval('order_number_seq');
Return NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION getnextorderno()
OWNER TO postgres;
編輯#1: 重命名觸發如下建議,讓一切的pgAdmin下正常工作,但仍無法在PetaPoco插入。任何想法爲什麼?
CREATE TRIGGER zzz_get_next_order_number_trigger
BEFORE INSERT
ON returntooffice
FOR EACH ROW
EXECUTE PROCEDURE getnextorderno();
如果你確實創建了這樣的插入觸發器,存儲的值**將**始終從序列中取出。必須有其他事情正在進行。 –
@a_horse_with_no_name同意。但即使直接使用PgAdmin,觸發器似乎也被忽略。我不明白。 :(如果我沒有記錯,這確實工作的PostgreSQL 9.3 –