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. Благодаря всем вам, я дал всем большие пальцы вверх, я могу заняться другим драконом сегодня и помочь пациенту сделать шаг вперед! "
Ответы
Ответ 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')
Он работал у меня, но не работал с пустой таблицей. Думаю.