【问题标题】:How to change the data type of column in oracleoracle中如何更改列的数据类型
【发布时间】:2020-07-27 18:34:06
【问题描述】:

我有一个主表。它包含 1300000 条记录。我想将列类型从 VARCHAR(100 CHAR) 更改为 VARCHAR2(300 CHAR)。

我计划了一种方法来做到这一点。我将创建一个具有新名称的新列,然后将数据从旧列复制到新列,然后我将删除旧列并用旧列名重命名新列。

但是主表包含一个触发器。它将数据添加到 master_history 表以进行更新和删除过程。那么,触发器将如何影响我的方式?如果我做上面的处理,可以吗?

我的触发器是:

ALTER TRIGGER "TRG_MASTER_" ENABLE;
CREATE OR REPLACE TRIGGER "MASTER" AFTER
    UPDATE OR
    DELETE ON MASTER FOR EACH ROW 
BEGIN
    INSERT
    INTO MASTER_HISTORY
       (
       ORDER_ID,
       CUSTOMER_FIRST_NAME,
       CUSTOMER_LAST_NAME,
       CUSTOMER_EMAIL,
       CUSTOMER_ADRESS      
       )
    VALUES
       (
       :OLD.ORDER_ID,   
       :OLD.CUSTOMER_FIRST_NAME,
       :OLD.CUSTOMER_LAST_NAME,
       :OLD.CUSTOMER_EMAIL,
       :OLD.CUSTOMER_ADDRESS,           
       );
END;

【问题讨论】:

  • Oracle 在内部将VARCHARVARCHAR2 视为相同,但是Oracle 推荐使用VARCHAR2。即使您将其创建为 VARCHAR,您也可以描述该表并看到 Oracle 会将其视为 VARCHAR2。
  • 牢记其他 cmets,但仅解决您对触发器的担忧 - 如果归结为它,只需在转换操作期间禁用触发器,然后重新启用它。

标签: sql string oracle ddl database-trigger


【解决方案1】:

就问题而言,不需要这种复杂的逻辑。 Oracle 允许您使用以下命令扩展 varchar 列的宽度:

ALTER TABLE master_history MODIFY mycol VARCHAR2(300);
                               --^-- modify this to your real column name

扩展列的宽度不会影响现有数据。

【讨论】:

  • 没错。只要你把它做得更大,你就可以申请ALTER TABLE。其他类型转换可能需要类似于 OP 描述的过程。
  • @alexherm:如果您要缩短列,您需要做的就是确保列中的数据小于或等于所有行中的新长度,然后使用 ALTER TABLE . db<>fiddle here
  • 正确,但如果数据较长则失败。
猜你喜欢
  • 2019-12-25
  • 2021-07-16
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2015-03-26
  • 2022-10-22
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多