25

我创建了一个名为 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"

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

4

3 回答 3

60

您需要添加一列

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.nextvalINSERT

CREATE OR REPLACE TRIGGER trg_userlog_user_id
  BEFORE INSERT ON userlog
  FOR EACH ROW
BEGIN
  :new.user_id := user_id_seq.nextval;
END;
于 2012-12-09T00:27:12.543 回答
1

除了贾斯汀的出色回答之外,您可能希望将来防止您的 user_id 出现 NULL 值(因为它们仍然可能是由 UPDATE 语句引起的)。因此,最后执行以下语句:

ALTER TABLE userlog MODIFY(user_id number NOT NULL);

于 2018-04-17T08:47:03.783 回答
0

步骤 1. 创建列使用的序列,例如:

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

步骤 2. 使用序列更新新列,例如:

UPDATE userlog
   SET user_id = user_id_seq.nextval;

第 3 步 - 将序列设置为列的默认值,仅适用于 Oracle 12c

ALTER TABLE USERLOG
    MODIFY USER_ID INT DEFAULT user_id_seq.nextval;
于 2021-09-07T02:55:25.680 回答