我创建了一个表,一个序列和一个触发器。我用正确的数据添加第一条记录。在ID列中,我有1.然后我尝试添加无效数据的记录,我得到一个错误。正确的错误,将数据添加到表格。不幸的是,新记录ID = 3。为什么会发生这种情况?无论尝试输入无效数据的次数如何,我都会在ID列中始终有连续的数字。如何创建正确的工作顺序?
--CREATING TABLE TEST
CREATE TABLE TEST_TABLE
("ID" NUMBER PRIMARY KEY NOT NULL,
"NAME" VARCHAR2(20) NOT NULL,
"PERSONAL_ID_NUM" VARCHAR(11) UNIQUE NOT NULL,
CONSTRAINT "LENGTH_PIN" CHECK (LENGTH(PERSONAL_ID_NUMBER) = 11),
CONSTRAINT "IS_DIGIT_PIN" CHECK (REGEXP_LIKE(P_PESEL2,'^[0-9]*$'))
);
--CREATING SEQUENCE
CREATE SEQUENCE SEQ_TEST_TABLE START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 2;
--CREATING TRIGGER
CREATE OR REPLACE TRIGGER TR_TEST_TABLE
BEFORE INSERT ON TEST_TABLE FOR EACH ROW
BEGIN
SELECT SEQ_TEST_TABLE.NEXTVAL
INTO :new.ID
FROM dual;
END;
--INSERT DATA, VALID VALUES
INSERT INTO TEST_TABLE(ID, NAME, PERSONAL_ID_NUM)
VALUES(SEQ_TEST_TABLE.NEXTVAL, 'JOHN', '12345678901');
--CHECK TABLE
SELECT * FROM TEST_TABLE;
--TRYING INSERT NOT VALID VALUES
INSERT INTO TEST_TABLE(ID, NAME, PERSONAL_ID_NUM)
VALUES(SEQ_TEST_TABLE.NEXTVAL, 'EMIL', '1234567890A');
--INSERT VALID VALUES
INSERT INTO TEST_TABLE(ID, NAME, PERSONAL_ID_NUM)
VALUES(SEQ_TEST_TABLE.NEXTVAL, 'EMIL', '12345678902');
--CHECK TABLE (NEW ROW HAVE ID = 3)
SELECT * FROM TEST_TABLE;
当ID col是主键时,为什么要用Sequence值填充此值。触发器执行Seq值,当它失败时,下一个值将被插入到表中。不要使用Seq。只使用主键来实现这一点。 –
使用序列连续编号几乎是不可能的 - 无论你怎么想,你都不需要它们在数据库中!考虑回滚 - 每次生成下一个序列号时,都会发生一些错误,该数字会丢失。所以在序列号中有“漏洞”是完全正确的。一旦你得到了报告(或其他),你可以用任何你想要的方式生成数字。 –