web-dev-qa-db-fra.com

Oracle - Insérer une nouvelle ligne avec un ID incrémentiel automatique

J'ai une table de workqueue qui a une colonne de workid. La colonne workID a des valeurs qui s'incrémentent automatiquement. Existe-t-il un moyen de lancer une requête dans le serveur afin d’insérer une nouvelle ligne et d’incrémenter automatiquement la colonne workID?
Lorsque j'essaie d'insérer un null, il génère l'erreur ORA01400: impossible d'insérer null dans workid.

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

Ce que j'ai essayé jusqu'ici - j'ai essayé de regarder les détails de la table et je n'ai pas vu d'incrémentation automatique. Le script de table est comme suit

"WORKID" NUMBER NOT NULL ENABLE,

Base de données: Oracle 10g

Capture d'écran de certaines données existantes. enter image description here


REPONSE:

Je dois remercier tout le monde pour l'aide. La journée d'aujourd'hui a été une excellente expérience d'apprentissage et sans votre soutien, je n'aurais pas pu le faire. En bout de ligne, j’essayais d’insérer une ligne dans un tableau contenant 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é à rechercher ces séquences et à trouver celle qui est pour cette colonne workid. Grâce à vous tous, j'ai félicité tout le monde, je suis en mesure de m'attaquer à un autre dragon aujourd'hui et d'aider les patients à faire un pas en avant! "

29
Shaji

Pour obtenir un numéro d'incrémentation automatique, vous devez utiliser une séquence dans Oracle. (Voir ici 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;
/
18
Johnny Graber

Il n'y a pas d'auto_increment intégré dans Oracle.

Vous devez utiliser sequences et triggers.

Lire ici comment le faire correctement. (Procédure pas à pas pour "Créer des colonnes à incrémentation automatique dans Oracle")

18
SlavaNov

C'est un moyen simple de le faire sans déclencheurs ni séquences:

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.

8
Zsolt Sky
 ELXAN @ DB1> créer une table cedvel (id idier, ad varchar2 (15)); 
 
 Table créée. 
 
 ELXAN @ DB1> alter table cedvel add contrainte pk_ad clé primaire (id); 
 
 Table modifiée. 
 
 ELXAN @ DB1> créer la séquence test_seq commence avec 1 incrément de 1; 
 
 Séquence créée. 
 
 ELXAN @ DB1> créer ou remplacer le déclencheur ad_insert 
 Avant l'insertion sur cedvel 
 REFERENCING NEW AS NEW OLD À L'ADRESSE. 
 Pour chaque ligne 
 Commence 
, Sélectionnez test_seq.nextval dans: new.id from dual; 
 End; 
/2 3 4 5 6 7 8 
 
 Déclencheur créé. 
 
 ELXAN @ DB1> insérer dans cedvel (ad) des valeurs ('nese'); 
 
 1 rangée créée. 
3
elxan

Vous pouvez utiliser SEQUENCE ou TRIGGER pour incrémenter automatiquement la valeur d'une colonne donnée dans votre table de base de données. Toutefois, l'utilisation de TRIGGERS serait plus appropriée. Reportez-vous à la documentation Oracle suivante, qui contient les principales clauses utilisées avec les déclencheurs avec des exemples appropriés.

Utilisez l'instruction CREATE TRIGGER pour créer et activer un déclencheur de base de données, à savoir:

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

  • Un bloc PL/SQL anonyme ou un appel à une procédure implémentée en PL/SQL ou Java

Oracle Database exécute automatiquement un déclencheur lorsque les conditions spécifiées sont remplies. Voir .


Voici un simple TRIGGER comme exemple pour vous, qui insère la valeur de la clé primaire dans une table spécifiée en fonction de la valeur maximale de cette colonne. Vous pouvez modifier le nom du schéma, le nom de la table, etc. et l'utiliser. Juste essayer.

/*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érerait automatiquement des valeurs telles que CT0001, CT0002, CT0002 et ainsi de suite et insère dans la colonne donnée de la table spécifiée.

2
Lion
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
Vivek R

Pour être complet, je mentionnerai qu'Oracle 12c prend en charge cette fonctionnalité. En outre, c'est soi-disant 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
ragerdl

le savoir-faire complet, j'ai inclus un exemple des déclencheurs et de 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
Daniel Kennedy