Oracle-insérer une nouvelle rangée avec un ID incrémental automatique

j'ai une table workqueue qui a une colonne workid. La colonne workID a des valeurs qui augmentent automatiquement. Y a-t-il un moyen d'exécuter une requête dans le backend pour insérer une nouvelle ligne et avoir l'incrément de colonne workID automatiquement?

Quand j'essaie d'insérer un null, il lance l'erreur ORA01400 - ne peut pas insérer null dans workid.

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

Ce que j'ai essayé jusqu'à présent - j'ai essayé de regarder les informations de la table et ne vois pas l'auto-incrément. Le script de la table est comme suivez

"WORKID" NUMBER NOT NULL ENABLE,

Base de données: Oracle 10g

Screenshot de certaines données existantes. enter image description here


ANSWER:

je dois remercier tout le monde pour l'aide. Aujourd'hui a été une grande expérience d'apprentissage et sans votre soutien, je n'aurais pas pu le faire. Bref, j'essayais d'insérer une rangée dans une table qui a déjà des séquences et des déclencheurs. Tout ce que j'avais à faire était de trouver la bonne séquence, pour ma question, et d'appeler cette séquence dans ma requête.

les liens que vous m'avez tous fournis m'ont aidé à chercher ces séquences et à trouver celle qui est pour cette colonne de workid. Grâce à vous tous, j'ai applaudi tout le monde, je suis capable de m'attaquer à un autre dragon aujourd'hui et d'aider les soins aux patients à faire un pas en avant!"

27
demandé sur Jonathan Leffler 2012-01-03 23:38:29

8 réponses

pour obtenir un numéro d'incrément automatique, vous devez utiliser une séquence dans Oracle. (Voirici et ici).

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;
/
13
répondu Johnny Graber 2014-04-30 09:07:43

il n'y a pas d'augmentation automatique intégrée dans Oracle.

Vous devez utiliser sequences et triggers.

Lire ici comment le faire correctement. (L'étape-par-étape pour "la Création d'auto-incrémentation des colonnes dans Oracle")

18
répondu SlavaNov 2012-01-03 19:42:22

C'est une façon simple de le faire sans aucun déclencheur ou séquence:

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

cela a fonctionné pour moi mais ne fonctionnerait pas avec une table vide, je suppose.

4
répondu Zsolt Sky 2017-05-30 15:15:31
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.
3
répondu elxan 2012-01-03 20:30:36

Vous pouvez utiliser SEQUENCE ou TRIGGER pour incrémenter automatiquement la valeur d'une colonne dans la table de base de données cependant, l'utilisation de TRIGGERS serait plus approprié. Voir la documentation suivante D'Oracle qui contient des clauses majeures utilisées avec des déclencheurs avec des exemples appropriés.

utilisez L'instruction CREATE TRIGGER pour créer et activer un trigger de base de données, qui est:

  • un bloc PL/SQL stocké associé à une table, un le schéma ou le la base de données ou

  • un bloc PL/SQL anonyme ou un appel à une procédure mise en œuvre dans PL / SQL ou Java

la base de données Oracle exécute automatiquement un déclencheur lorsque les conditions spécifiées se produisent. Voir.


suivant est un simple TRIGGER juste un exemple pour vous qui insère la valeur de clé primaire dans une table spécifique, basé sur le valeur maximale de cette colonne. Vous pouvez modifier le nom du schéma, le nom de la table, etc et l'utiliser. Juste lui donner un essai.

/*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;

génère automatiquement des valeurs telles que CT0001,CT0002,CT0002 et ainsi de suite et insère dans la colonne donnée du tableau spécifié.

2
répondu Lion 2012-01-03 20:25:51
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;

/

1
répondu Vivek R 2013-03-04 15:15:41

le savoir comment, j'ai inclus un exemple de la déclenche et la séquence

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;

référence: http://thenullpointerexceptionx.blogspot.mx/2013/06/llaves-primarias-auto-incrementales-en.html

1
répondu Daniel Kennedy 2016-02-10 22:48:30

pour être complet, je mentionnerai Qu'Oracle 12c supporte cette fonctionnalité. C'est aussi censé être plus rapide que l'approche des déclencheurs. Par exemple:

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
répondu ragerdl 2016-02-10 23:54:53