Подтвердить что ты не робот

Oracle - вставить новую строку с автоинкрементным идентификатором

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

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

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

"WORKID" NUMBER NOT NULL ENABLE,

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

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


ОТВЕТ:

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

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

4b9b3361

Ответ 1

Чтобы получить номер автоматического увеличения, вам нужно использовать последовательность в 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;
/

Ответ 2

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

Вам нужно использовать sequences и triggers.

Прочитайте здесь, как это сделать правильно. (Пошаговое руководство для "Создание столбцов автоматического увеличения в Oracle" )

Ответ 3

[email protected]> create table cedvel(id integer,ad varchar2(15));

Table created.

[email protected]> alter table cedvel add constraint pk_ad primary key(id);

Table altered.

[email protected]> create sequence test_seq start with 1 increment by 1;

Sequence created.

[email protected]> 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.

[email protected]> insert into cedvel (ad) values ('nese');

1 row created.

Ответ 4

Вы можете использовать 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 и т.д. и вставляемые в указанный столбец указанной таблицы.

Ответ 5

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;

/

Ответ 6

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

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

Ответ 7

Для полноты я упомянул, что 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 ) ;

Ответ 8

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

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

Он работал у меня, но не работал с пустой таблицей. Думаю.