sql - 尝试替换列时出现 Oracle SQL 错误 "ORA-00984: column not allowed here"

标签 sql oracle

此问题this one 重复。因为即使错误消息相同,那里的答案也不适用于我的情况。

我需要将之前定义为 VARCHAR(36) NOT NULL 的 PK Id 列更改为增量整数值。我正在尝试编写一个脚本来执行此操作,但是当我运行 alter table 语句时,它失败并出现标题错误。

该表先前定义为:

CREATE TABLE journal_messages(
    ID           VARCHAR(36)    NOT NULL, -- column to be changed
    MESSAGE      VARCHAR(2048) NOT NULL,
    MESSAGE_TYPE VARCHAR(30) NOT NULL,
    MSG_DATE     TIMESTAMP      NOT NULL,
    MODULE_CODE  INTEGER NOT NULL    
);

ALTER TABLE journal_messages ADD (CONSTRAINT journal_messages_pk PRIMARY KEY (ID));

我正在运行的脚本是:

DELETE FROM JOURNAL_MESSAGES;

ALTER TABLE JOURNAL_MESSAGES DROP COLUMN ID;

CREATE SEQUENCE journal_messages_seq START WITH 1;

ALTER TABLE JOURNAL_MESSAGES ADD (ID NUMBER(10) DEFAULT journal_messages_seq.nextval NOT NULL); -- error happens here

ALTER TABLE journal_messages ADD (
  CONSTRAINT journal_messages_pk PRIMARY KEY (ID));

当我尝试创建触发器来更新增量时,它失败并显示 SQL 错误 [4098] [42000]: ORA-04098: 触发器 'TRG_SEQ_JOURNAL_MSG' 无效且重新验证失败当我尝试插入新元组时:

ALTER TABLE JOURNAL_MESSAGES DROP COLUMN ID;

ALTER TABLE JOURNAL_MESSAGES ADD (ID NUMBER(10) NOT NULL);

create or replace trigger trg_seq_journal_msg
      before insert on journal_messages
      for each row
    begin
      :new.id := journal_messages_seq.nextval;
    end;
    /

INSERT INTO JOURNAL_MESSAGES (message, MESSAGE_TYPE, msg_date, MODULE_CODE) VALUES ('test', 'alteration', CURRENT_TIMESTAMP, '10');

最佳答案

嗯...不是那样,而是这样:

  • 表为空后,您不必删除该列 - 只需修改其数据类型即可
  • 使用触发器自动设置 ID 值

如果您使用的是 12c,您可以使用身份列。

SQL> CREATE TABLE journal_messages(
  2      ID           VARCHAR(36)    NOT NULL, -- column to be changed
  3      MESSAGE      VARCHAR(2048) NOT NULL,
  4      MESSAGE_TYPE VARCHAR(30) NOT NULL,
  5      MSG_DATE     TIMESTAMP      NOT NULL,
  6      MODULE_CODE  INTEGER NOT NULL
  7  );

Table created.

SQL> delete from journal_Messages;

0 rows deleted.

SQL> alter table journal_messages modify (id number(10));

Table altered.

SQL> CREATE SEQUENCE journal_messages_seq START WITH 1;

Sequence created.

SQL> create or replace trigger trg_bi_joumes
  2    before insert on journal_messages
  3    for each row
  4  begin
  5    :new.id := journal_messages_seq.nextval;
  6  end;
  7  /

Trigger created.

SQL>

[编辑:阅读您的评论并看到您的版本后]

仍然可以正常工作 - 我确实复制/粘贴了你的代码并得到了这个:

SQL> ALTER TABLE JOURNAL_MESSAGES DROP COLUMN ID;

Table altered.

SQL> ALTER TABLE JOURNAL_MESSAGES ADD (ID NUMBER(10) NOT NULL);

Table altered.

SQL> create or replace trigger trg_seq_journal_msg
  2        before insert on journal_messages
  3        for each row
  4      begin
  5        :new.id := journal_messages_seq.nextval;
  6      end;
  7      /

Trigger created.

SQL> INSERT INTO JOURNAL_MESSAGES (message, MESSAGE_TYPE, msg_date, MODULE_CODE) VALUES ('test', 'alteration', CURRENT_TIMESTAMP, '10')
  2  ;

1 row created.

SQL>

如您所见,一切似乎都很好。请尝试以下操作:重新编译触发器并显示错误(如果有的话;如果有,请在此处发布):

SQL> alter trigger trg_seq_journal_msg compile;

Trigger altered.

SQL> show err
No errors.
SQL>

关于sql - 尝试替换列时出现 Oracle SQL 错误 "ORA-00984: column not allowed here",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54520878/

相关文章:

sql - SYSDATE 但指定时间

mysql - 用于查询优化的时间范围的 MySQL 结构是否正确?

mysql - 我应该为长内容使用哪种数据类型?

java - 使用 Eclipse 的 Oracle NLS_DATE_FORMAT

java - 用于替换符号的正则表达式

sql - 如何防止用户使用表空间中的空间?

java - ORA-04054 : database link GMAIL. COM 不存在

php - MYSQL LIKE 对于不同的语言有不同的行为,所有表都是utf8

SQL Filter - 使用多列组合进行过滤

mysql - 谁能帮我写sql语句?