Oracle - вставьте новую строку с автоматическим инкрементным идентификатором - PullRequest
29 голосов
/ 03 января 2012

У меня есть таблица рабочей очереди, в которой есть столбец workid.Столбец workID имеет значения, которые увеличиваются автоматически.Есть ли способ выполнить запрос в серверной части, чтобы вставить новую строку и автоматически увеличить столбец workID?
Когда я пытаюсь вставить нулевое значение, выдается ошибка ORA01400 - Невозможно вставить нулевое значение в рабочий идентификатор.

insert into WORKQUEUE  (facilitycode,workaction,description) values ('J', 'II',    'TESTVALUES')

То, что я пробовал до сих пор - я пытался посмотреть на детали таблицы и не видел никакого автоинкремента.Сценарий таблицы выглядит следующим образом:

"WORKID" NUMBER NOT NULL ENABLE,

База данных: Oracle 10g

Снимок экрана с некоторыми существующими данными.enter image description here


ОТВЕТ:

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

Ссылки, которые вы мне предоставили, помогли мне найти эти последовательности и найти ту, которая предназначена для этого workid.колонка.Спасибо вам всем, я поднял все пальцы вверх, сегодня я могу справиться с другим драконом и помочь уходу за пациентами сделать шаг вперед! "

Ответы [ 8 ]

18 голосов
/ 03 января 2012

В Oracle нет встроенного auto_increment.

Вам необходимо использовать sequences и triggers.

Чтение здесь как это сделать правильно.(Пошаговое руководство по созданию столбцов с автоинкрементом в Oracle)

17 голосов
/ 03 января 2012

Чтобы получить номер автоматического приращения, вам нужно использовать последовательность в Oracle.(См. здесь и здесь ).

CREATE SEQUENCE my_seq;

SELECT my_seq.NEXTVAL FROM DUAL; -- to get the next value

-- use in a trigger for your table demo
CREATE OR REPLACE TRIGGER demo_increment 
BEFORE INSERT ON demo
FOR EACH ROW

BEGIN
  SELECT my_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/
8 голосов
/ 24 мая 2017

Это простой способ сделать это без каких-либо триггеров или последовательностей:

insert into WORKQUEUE (ID, facilitycode, workaction, description)
  values ((select max(ID)+1 from WORKQUEUE), 'J', 'II', 'TESTVALUES')

Это сработало для меня, но, думаю, не будет работать с пустой таблицей.

3 голосов
/ 04 января 2012
ELXAN@DB1> create table cedvel(id integer,ad varchar2(15));

Table created.

ELXAN@DB1> alter table cedvel add constraint pk_ad primary key(id);

Table altered.

ELXAN@DB1> create sequence test_seq start with 1 increment by 1;

Sequence created.

ELXAN@DB1> create or replace trigger ad_insert
before insert on cedvel
REFERENCING NEW AS NEW OLD AS OLD
for each row
begin
    select test_seq.nextval into :new.id from dual;
end;
/  2    3    4    5    6    7    8 

Trigger created.

ELXAN@DB1> insert into cedvel (ad) values ('nese');

1 row created.
2 голосов
/ 03 января 2012

Вы можете использовать SEQUENCE или TRIGGER для автоматического увеличения значения данного столбца в таблице базы данных, однако более подходящим будет использование TRIGGERS. См. Следующую документацию Oracle, которая содержит основные предложения, используемые с триггерами, с подходящими примерами.

Используйте оператор CREATE TRIGGER, чтобы создать и включить триггер базы данных, а именно:

  • Сохраненный блок PL / SQL, связанный с таблицей, схемой или база данных или

  • Анонимный блок PL / SQL или вызов процедуры, реализованной в PL / SQL или Java

База данных Oracle автоматически выполняет триггер при возникновении указанных условий. См .


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

/*Create a database trigger that generates automatically primary key values on the CITY table using the max function.*/

CREATE OR REPLACE TRIGGER PROJECT.PK_MAX_TRIGGER_CITY
BEFORE INSERT ON PROJECT.CITY
FOR EACH ROW
DECLARE 
    CNT NUMBER;
    PKV CITY.CITY_ID%TYPE;
    NO NUMBER;
BEGIN
    SELECT COUNT(*)INTO CNT FROM CITY;

    IF CNT=0 THEN
        PKV:='CT0001';
    ELSE
        SELECT 'CT'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV
        FROM CITY;
    END IF; 
    :NEW.CITY_ID:=PKV;
END;

Будет автоматически генерировать такие значения, как CT0001, CT0002, CT0002 и т. Д., И вставлять в указанный столбец указанной таблицы.

1 голос
/ 11 февраля 2016

Для полноты картины упомяну, что Oracle 12c поддерживает эту функцию. Кроме того, он предположительно быстрее, чем подход триггеров. Например:

CREATE TABLE foo
  (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY (
    START WITH 1 NOCACHE ORDER ) NOT NULL ,
    name       VARCHAR2 (50)
  )
  LOGGING ;
ALTER TABLE foo ADD CONSTRAINT foo_PK PRIMARY KEY ( id ) ;
1 голос
/ 26 июня 2013

полное ноу-хау, я включил пример триггеров и последовательность

create table temasforo(
idtemasforo NUMBER(5) PRIMARY KEY,
autor       VARCHAR2(50) NOT NULL,
fecha       DATE DEFAULT (sysdate),
asunto      LONG  );

create sequence temasforo_seq
  start with 1
  increment by 1
  nomaxvalue;

create or replace
trigger temasforo_trigger
  before insert on temasforo
  referencing OLD as old NEW as new
  for each row
  begin
      :new.idtemasforo:=temasforo_seq.nextval;
    end;

ссылка: http://thenullpointerexceptionx.blogspot.mx/2013/06/llaves-primarias-auto-incrementales-en.html

1 голос
/ 04 марта 2013
SQL trigger for automatic date generation in oracle table:

CREATE OR REPLACE TRIGGER name_of_trigger

BEFORE INSERT

ON table_name

REFERENCING NEW AS NEW

FOR EACH ROW

BEGIN

SELECT sysdate INTO :NEW.column_name FROM dual;

END;

/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...