Я совершенно сбит с толку моей нынешней ситуации:оракул неправильный первичный ключ вставлен в таблицу
Мой рубиновый по применению рельсов создающего следующий запрос:
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;
Поле 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
Спасибо XQbert. Можно ли вставить идентификатор, указанный в первоначальном запросе. Это важно, потому что за вышеуказанным запросом следует другой запрос (для таблицы соединений), который вставляет указанный первичный ключ в качестве внешнего ключа. – Micheal