如何将序列列添加到包含记录的现有表中

时间:2012-12-08 23:00:44

标签: sql oracle11g

我创建了一个名为USERLOG的新表,其中包含前一个VIEW中的两个字段。该表已包含约9000条记录。从VIEW获取的两个字段,即weblog_views包括IP(由IP地址组成)和WEB_LINK(由URL组成)。这是我使用的代码,

    CREATE TABLE USERLOG
    AS
    SELECT C_IP, WEB_LINK FROM weblog_views;

我想在此表中添加另一个名为USER_ID的列,该列包含一个以1到9000条记录开头的序列,以便为每个现有行创建唯一的ID。我需要这方面的帮助。我使用的是Oracle SQL Developer:ODMiner 3.0.04版。 我尝试使用AUTO-INCREMENT选项,

    ALTER TABLE USERLOG
    ADD USER_ID INT UNSIGNED NOT NULL AUTO_INCREMENT;

但是我得到了一个错误,

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

所以,我真的很感激我能得到的任何帮助!

2 个答案:

答案 0 :(得分:47)

您需要添加一列

ALTER TABLE userlog
  ADD( user_id number );

创建序列

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

更新表格中的数据

UPDATE userlog
   SET user_id = user_id_seq.nextval

假设您希望user_id成为主键,那么您将添加主键约束

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

如果您想在执行user_id时使用序列自动添加INSERT(另一个选项是在user_id_seq.nextval语句中专门引用INSERT ,你还需要一个触发器

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

答案 1 :(得分:0)

除了Justin的优秀答案之外,您可能希望将来阻止user_id的NULL值(因为它们仍可能由UPDATE语句引起)。因此,最后执行以下语句:

ALTER TABLE userlog MODIFY(user_id number NOT NULL);