2015-03-11 2 views
0

Я совершенно сбит с толку моей нынешней ситуации:оракул неправильный первичный ключ вставлен в таблицу

Мой рубиновый по применению рельсов создающего следующий запрос:

INSERT INTO «MEMBER_ROLES» («ID», " NAME "," ORG_ID ") VALUES (: a1,: a2,: a3) [[" id ", 55], [" name "," test6 "], [" org_id "," 2 "]]

Казалось, что запрос работал, и я вижу эту запись в моей таблице базы данных, за исключением того, что поле «id» не установлено на «55», но «56».

Это происходит с каждой вставкой. Фактический первичный ключ вставлен всегда на 1 больше, чем выглядит вышеприведенный оператор вставки.

Я не уверен, связано ли это с тем, как мой стол создан?

CREATE TABLE member_roles 
(
    id NUMBER(38,0) primary key, 
    name VARCHAR2(200) not NULL, 
    org_id VARCHAR2(200) not NULL, 
    created_at DATE default sysdate not null, 
    updated_at DATE default sysdate not null 
) 


CREATE SEQUENCE MEMBER_ROLES_SEQ; 

set define off; 
CREATE OR REPLACE TRIGGER member_roles_bir 
BEFORE INSERT ON MEMBER_ROLES 
FOR EACH ROW 

BEGIN 
    SELECT MEMBER_ROLES_SEQ.NEXTVAL 
    INTO :new.id 
    FROM dual; 
END; 
+0

Поле ID управляется ПОСЛЕДОВАТЕЛЬНОСТИ. Идентификатор, который был принят, изменяется перед оператором insert; получив «Следующее значение» из последовательности. 'Выберите Sequence_owner, Increment_By, Last_Number из ALL_Sequences, где sequence_name = 'MEMBER_ROLES_SEQ'' покажет вам текущую последовательность. .nextval добавляет 1 ... Таким образом, любой идентификатор, который вы передаете, будет «ЗАМЕНА», что бы ни было в последовательности .nextval. вот что такое 'new.Id'. Идентификатор, который был принят, заменяется на Sequence.nextval из member_roles_Seq. Проще говоря, идентификатор, который вы передаете, IRRELEVANT. Он переопределен SEQ. – xQbert

+0

Спасибо XQbert. Можно ли вставить идентификатор, указанный в первоначальном запросе. Это важно, потому что за вышеуказанным запросом следует другой запрос (для таблицы соединений), который вставляет указанный первичный ключ в качестве внешнего ключа. – Micheal

ответ

1

Как вы получаете идентификатор, который вы используете для вставки? Вы получаете это из последовательности? Триггер перезаписывает ваш идентификатор следующим значением последовательности.

вы можете попробовать вставить с идентификатором = -99, и вы увидите, что она будет перезаписана тоже ...

+0

use * RETURNING id INTO: out * для получения правильного идентификатора –

+0

Могу ли я обновить последовательность или триггер так, чтобы вместо этого был вставлен идентификатор в инструкции insert? – Micheal

+0

вы можете изменить триггер с 'IF: new.id IS NULL THEN' перед' SELECT ... 'и' END IF; 'после него, но вы рискуете исключение UNIQUE CONSTRAINT VIOLATED, когда кто-то вставляет ручной идентификатор и последовательность достигает этого значения –