sqlplus oracle11g, почему sequence.nextval автоматически увеличивает значение при первом вызове? - PullRequest
1 голос
/ 02 мая 2020

Мне кажется, что я схожу с ума, вот параметры таблицы

CREATE TABLE member(
member_id number(4,0) not null,
first_name varchar2(25) not null,
last_name varchar2(25) not null,
street varchar2(25) not null,
city varchar2(15) not null,
phone char(11) not null,
valid_date date not null,
balance number not null,
constraint member_pk PRIMARY KEY(member_id));

Оператор sequence

CREATE SEQUENCE member_seq
START WITH 110
INCREMENT BY 1
MinValue 110
MaxValue 999
Nocycle
Cache 50;

Мой первый оператор вставки для таблицы

INSERT INTO member
VALUES(member_seq.nextval, 'JACK', 'WHITE', '123 MAIN ROAD', 'RALEIGH', '919-7763838', '01-JAN-99', 0);

Когда я запускаю оператор select, чтобы проверить вставку, значение member_id последовательности равно 111, а не 110, я переделал все, пытаясь сначала вызвать currval, и это не может работать, потому что вы не можете вызвать currval, пока не инициализируете последовательность, пожалуйста, помогите .

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Предположительно, это не имеет большого значения. Вы используете последовательность для генерации ключей, потому что на самом деле вас не волнует, что это за значения или есть пробелы только в том, что значения уникальны. Если это не так, у вас другой набор проблем.

Что означает deferred_segment_creation? Я предполагаю, что он установлен на true, поэтому сегмент не создается при создании таблицы. Он создается при запуске следующего insert, который внутренне заставляет Oracle откатить начальный insert, создать сегмент и затем повторно выполнить insert, который вызывает nextval во второй раз. Если это так, вы можете принудительно создать сегмент при создании таблицы

CREATE TABLE member(
    member_id number(4,0) not null,
    first_name varchar2(25) not null,
    last_name varchar2(25) not null,
    street varchar2(25) not null,
    city varchar2(15) not null,
    phone char(11) not null,
    valid_date date not null,
    balance number not null,
    constraint member_pk PRIMARY KEY(member_id)
 )
 segment creation immediate;
0 голосов
/ 04 мая 2020

Если я правильно понимаю вашу проблему -

Не следует использовать select member_seq.nextval from dual ; для проверки текущего порядкового номера. Oracle внутренне увеличивает число до следующего. Порядковый номер исчерпан. [Даже если вы не выполнили COMMIT в сеансе]

Используйте также использовать запрос ниже, чтобы проверить текущее значение

SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

После запуска вставки:

  1. вы можете проверить в своей таблице select member_id from member

  2. вы можете запросить select member_seq.currval from dual ; Это даст ваше текущее значение.

После запуска создать таблицу, создать последовательность и вставить. Запустите ниже вопросы, вы получите честную идею.

select member_id from member;
MEMBER_ID
----------
   110

select member_seq.currval from dual ;
CURRVAL
----------
   110

select member_seq.nextval from dual ; -- increments to next value 
CURRVAL
----------
   111

select member_seq.currval from dual ; -- Since you ran nextval above, sequence incremented 
CURRVAL
----------
   111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...