Bitte siehe Antwort unten und Edit # 1. Der Trigger schlägt jedoch immer noch unter PetaPoco/Npgsql fehl.Wie erzwingen neue Datensätze, um Spaltenwerte nur aus einer Sequenz in PostgreSQL zu haben?
Ich vermisse etwas Grundlegendes hier. Ich muss dafür sorgen, dass jeder Datensatz hinzugefügt, um die Tabelle hat eine Bestellung nur durch die Sequenz. Dies sollte auch dann gelten, wenn der Befehl nicht von der INSERT-Anweisung selbst geliefert wird. Das heißt,
insert into returntooffice (chart_recid, returndate, torder, **orderno**) values (14982,'2016-11-09','2017-12-4 00:21:42.553508', **0**);
und
insert into returntooffice (chart_recid, returndate, torder) values (14982,'2016-11-09','2017-12-4 00:21:42.553508');
sollte sowohl Ergebnis in dem nächsten OrderNo von der Sequenz und nicht einen OrderNo von 0. Das heißt, was tatsächlich geschieht, ist, dass die gelieferte orderno (von 0) wird eingefügt - nicht der nächste Sequenzwert (von 8000). Ich benutze hier einen Trigger, da das tatsächlich zusammengesetzte Insert von einem ORM stammt, das die postgreSQL DEFAULT-Klauseln für Spalten nicht berücksichtigt.
Hier sind die Details:
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;
Edit # 1: Umbenennen der Auslöser, wie unten vorgeschlagen, ermöglicht alles richtig unter pgAdmin zu arbeiten, aber immer noch nicht auf PetaPoco einfügen. Irgendwelche Ideen warum?
CREATE TRIGGER zzz_get_next_order_number_trigger
BEFORE INSERT
ON returntooffice
FOR EACH ROW
EXECUTE PROCEDURE getnextorderno();
Wenn Sie den Insert-Trigger tatsächlich so erzeugt haben, wird der gespeicherte Wert ** immer aus der Sequenz genommen. Es muss etwas anderes passieren. –
@a_horse_with_no_name Einverstanden. Aber der Auslöser scheint ignoriert zu werden, selbst wenn es direkt mit PgAdmin gemacht wird. Ich verstehe es nicht. :(Wenn ich mich richtig erinnere, funktionierte das in PostgreSQL 9.3 –