我有一个名为T1的表,该表具有一个字段id(int8)和一个名为seq_id的序列。 我可以使用seq_id.nextval作为notifyix数据库中id的默认值吗? 或者另一种方式 在插入seq_id.nextval之前可以使用触发器更新ID吗? 先谢谢了, 塞纳·穆罕默德里亚(Saina Mohamadyari)
答案 0 :(得分:0)
在Informix中,您不能将序列NEXTVAL
用作列的默认值。
一种选择是将列变成BIGSERIAL
。
其他选项带有插入触发器。我没有找到在触发器定义中直接分配序列NEXTVAL
的方法,但是可以通过使用存储过程来完成。
CREATE SEQUENCE seq_id
INCREMENT BY 1 START WITH 1
MINVALUE 0
NOCYCLE CACHE 10
ORDER;
CREATE TABLE t1
(
id BIGINT NOT NULL
, val1 CHAR(4)
);
我发现了使用该程序的两种方法。通用过程,返回序列NEXTVAL
和触发器过程,该过程将序列NEXTVAL
分配给ID。
使用通用过程:
CREATE FUNCTION spl_get_seq_id()
RETURNING BIGINT AS seq_id_next;
DEFINE seq_id_next BIGINT;
LET seq_id_next = seq_id.NEXTVAL;
RETURN seq_id_next;
END FUNCTION;
CREATE TRIGGER t1_ti
INSERT ON t1 REFERENCING NEW AS new_ins
FOR EACH ROW
(
EXECUTE FUNCTION spl_get_seq_id() INTO id
);
在表中插入一些值并检查结果:
INSERT INTO t1( id, val1 ) VALUES ( 1000, 'AAAA' );
INSERT INTO t1( val1 ) VALUES ( 'AAAB' );
INSERT INTO t1( id ) VALUES ( 1 );
INSERT INTO t1( id, val1 ) VALUES ( NULL::BIGINT, 'AAAD' );
SELECT * FROM t1;
id val1
1 AAAA
2 AAAB
3
4 AAAD
使用触发过程:
DROP TRIGGER t1_ti;
CREATE PROCEDURE t1_ti_spl_get_seq_id()
REFERENCING NEW AS new_values FOR t1;
LET new_values.id = seq_id.NEXTVAL;
END PROCEDURE;
CREATE TRIGGER t1_ti
INSERT ON t1
FOR EACH ROW
(
EXECUTE PROCEDURE t1_ti_spl_get_seq_id() WITH TRIGGER REFERENCES
);
在表中插入一些值并检查结果:
INSERT INTO t1( id, val1 ) VALUES ( 1000, 'AAAE' );
INSERT INTO t1( val1 ) VALUES ( 'AAAF' );
INSERT INTO t1( id ) VALUES ( 1 );
INSERT INTO t1( id, val1 ) VALUES ( NULL::BIGINT, 'AAAH' );
SELECT * FROM t1;
id val1
1 AAAA
2 AAAB
3
4 AAAD
5 AAAE
6 AAAF
7
8 AAAH
我在BIGINT
列中使用了id
,但是它应该对INT8
有用(关于我为什么使用它,似乎有一些好处:Counters and codes: BIGINT, INT8, INTEGER, and SMALLINT)
编辑1:
为响应您的评论,您可以根据会话用户尝试在触发器上使用条件。仅在cdc软件正在使用专用用户的情况下才有效。在此示例中,cdc_agent
是cdc软件在Informix中使用的用户。
DATABASE db1;
GRANT CONNECT TO cdc_agent;
GRANT CONNECT TO myuser;
CREATE SEQUENCE seq_id
INCREMENT BY 2 START WITH 2
MINVALUE 0
NOCYCLE CACHE 10
ORDER;
GRANT SELECT ON seq_id TO cdc_agent;
GRANT SELECT ON seq_id TO myuser;
CREATE TABLE t1
(
id BIGINT NOT NULL
, val1 CHAR(4)
);
GRANT ALL ON t1 TO cdc_agent;
GRANT ALL ON t1 TO myuser;
CREATE PROCEDURE t1_ti_spl_get_seq_id()
REFERENCING NEW AS new_values FOR t1;
LET new_values.id = seq_id.NEXTVAL;
END PROCEDURE;
GRANT EXECUTE ON t1_ti_spl_get_seq_id TO cdc_agent;
GRANT EXECUTE ON t1_ti_spl_get_seq_id TO myuser;
CREATE TRIGGER t1_ti
INSERT ON t1 REFERENCING NEW AS new_ins
FOR EACH ROW WHEN ( USER <> "cdc_agent" )
(
EXECUTE PROCEDURE t1_ti_spl_get_seq_id() WITH TRIGGER REFERENCES
);
在表中插入一些值并检查结果:
-- with user "cdc_agent"
INSERT INTO t1( id, val1 ) VALUES ( 11, 'AAAA' );
INSERT INTO t1( id, val1 ) VALUES ( 13, 'AAAC' );
-- with user "myuser"
INSERT INTO t1( id, val1 ) VALUES ( 1, 'AAAB' );
INSERT INTO t1( id, val1 ) VALUES ( 3, 'AAAD' );
SELECT * FROM t1;
id val1
11 AAAA
13 AAAC
2 AAAB
4 AAAD