insert trigger to auto-set key fields for composite primary key
1
vote
1
answer
204
views
Basically the next step for https://dba.stackexchange.com/q/330357/272354 :
I created a trigger after insert to set
SEQ
to the highest SEQ
plus one if it's less than one.
Basically:
~~~lang-sqlite3
CREATE TRIGGER TRG_NAMES_ADD2 AFTER INSERT ON NAMES FOR EACH ROW
WHEN NEW.SEQ < 1
BEGIN
UPDATE NAMES SET
SEQ = (SELECT IFNULL(MAX(SEQ), 0) + 1 FROM NAMES WHERE TYPE = NEW.TYPE)
WHERE TYPE = NEW.TYPE AND SEQ = NEW.SEQ;
END;
~~~
However I'd like to do the same thing for TYPE
independently from SEQ
.
The problems I found were that I can have only one UPDATE
per trigger, and the AFTER INSERT
triggers may be executed in any order.
I tried a second trigger like this:
~~~lang-sqlite3
CREATE TRIGGER TRG_NAMES_ADD1 AFTER INSERT ON NAMES FOR EACH ROW
WHEN NEW.TYPE < 1
BEGIN
UPDATE NAMES SET
TYPE = (SELECT IFNULL(MAX(TYPE), 0) + 1 FROM NAMES),
SEQ = 1
WHERE TYPE = NEW.TYPE AND SEQ = NEW.SEQ;
END;
~~~
However for completeness TRG_NAMES_ADD2
should run after TRG_NAMES_ADD1
, or I would have to put both actions (set TYPE
to a possibly new value (if < 1), and then use that new value to possibly set a new value for SEQ
(if < 1), too) into one trigger.
Unfortunately that's beyond my capabilities.
For convenience, here's the table creation and some sample inserts:
~~~lang-sqlite3
CREATE TABLE NAMES (
TYPE INTEGER NOT NULL, SEQ INTEGER NOT NULL, NAME VARCHAR(20),
PRIMARY KEY (TYPE, SEQ)
);
insert into NAMES (type, seq, name) values (2, 3, "T1");
insert into NAMES (type, seq, name) values (2, 0, "T2");
insert into NAMES (type, seq, name) values (2, 0, "T3");
insert into NAMES (type, seq, name) values (0, 1, "T4");
insert into NAMES (type, seq, name) values (0, 0, "T5");
~~~
So the assignments should be like this:
~~~lang-text
T|S|N
-----
2|3|T1 # T,S set manually
2|4|T2 # S set automatically
2|5|T3 # S set automatically
3|1|T4 # T set automatically
4|1|T5 # T,S set automatically
~~~
Asked by U. Windl
(125 rep)
Aug 16, 2023, 01:30 PM
Last activity: Aug 23, 2023, 06:09 AM
Last activity: Aug 23, 2023, 06:09 AM