web-dev-qa-db-fra.com

Comment ajouter une colonne de séquence à une table existante avec des enregistrements

J'avais créé une nouvelle table nommée USERLOG avec deux champs d'une vue précédente. La table contient déjà environ 9 000 enregistrements. Les deux champs extraits de VIEW, c’est-à-dire que weblog_views se composent d’IP (se compose d’une adresse IP) et de WEB_LINK (se compose d’une URL). C'est le code que j'ai utilisé,

    CREATE TABLE USERLOG
    AS
    SELECT C_IP, WEB_LINK FROM weblog_views;

Je souhaite ajouter une autre colonne à cette table appelée USER_ID, qui consiste en une séquence commençant par 1 à 9 000 enregistrements afin de créer un identifiant unique pour chaque ligne existante. J'ai besoin d'aide pour cette partie. J'utilise Oracle SQL Developer: ODMiner version 3.0.04. J'ai essayé d'utiliser l'option AUTO-INCREMENT,

    ALTER TABLE USERLOG
    ADD USER_ID INT UNSIGNED NOT NULL AUTO_INCREMENT;

Mais je reçois une erreur avec ça,

    Error report:
    SQL Error: ORA-01735: invalid ALTER TABLE option
    01735. 00000 -  "invalid ALTER TABLE option"

J'apprécierais donc vraiment toute aide que je pourrais obtenir! 

17
user1888543

Vous auriez besoin d'ajouter une colonne

ALTER TABLE userlog
  ADD( user_id number );

créer une séquence

CREATE SEQUENCE user_id_seq
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

Mettre à jour les données dans la table

UPDATE userlog
   SET user_id = user_id_seq.nextval

En supposant que vous souhaitiez que user_id soit la clé primaire, vous ajouteriez ensuite la contrainte de clé primaire.

ALTER TABLE userlog
  ADD CONSTRAINT pk_user_id PRIMARY KEY( user_id );

Si vous souhaitez utiliser la séquence pour ajouter automatiquement le user_id lorsque vous faites un INSERT (l'autre option consisterait à référencer spécifiquement user_id_seq.nextval dans vos instructions INSERT, vous aurez également besoin d'un déclencheur.

CREATE OR REPLACE TRIGGER trg_userlog_user_id
  BEFORE INSERT ON userlog
  FOR EACH ROW
BEGIN
  :new.user_id := user_id_seq.nextval;
END;
45
Justin Cave