在包含数据的同时修改表的列,从数字到varchar2直接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在包含数据的同时修改表的列,从数字到varchar2直接相关的知识,希望对你有一定的参考价值。

我有两张桌子:

CREATE TABLE vendedores (
    cedula      NUMBER(11) NOT NULL,
    nombre      VARCHAR2(30) NOT NULL,
    apellido    VARCHAR2(30) NOT NULL,
    telefono    VARCHAR2(15) NOT NULL,
    direccion   VARCHAR2(60) NOT NULL,
    CONSTRAINT pk_vendedores PRIMARY KEY ( cedula )
)
TABLESPACE basedtp;

CREATE TABLE ventas (
    id                NUMBER(8) NOT NULL,
    id_cliente        NUMBER(8) NOT NULL,
    fecha             DATE NOT NULL,
    numero_factura    NUMBER(8) NOT NULL,
    monto_total       NUMBER(9) NOT NULL,
    plazo             NUMBER(2) NOT NULL,
    tipo              VARCHAR2(2) NOT NULL,
    cedula_vendedor   NUMBER(11) NULL,
    id_sucursal       NUMBER(2) NULL,
    CONSTRAINT pk_ventas PRIMARY KEY ( id ),
    CONSTRAINT fk_ventas_clientes FOREIGN KEY ( id_cliente )
        REFERENCES clientes ( id )
            ON DELETE CASCADE,
    CONSTRAINT fk_ventas_vendedores FOREIGN KEY ( cedula_vendedor )
        REFERENCES vendedores ( cedula )
            ON DELETE CASCADE,
    CONSTRAINT fk_ventas_sucursal FOREIGN KEY ( id_sucursal )
        REFERENCES sucursal ( id_sucursal )
            ON DELETE CASCADE
)
TABLESPACE basedtp;

如果我有一些数据,例如:

INSERT INTO vendedores (
    cedula,
    nombre,
    apellido,
    telefono,
    direccion
) VALUES (
    '4993886',
    'nombre_vendedor_01',
    'apellido_vendedor_01',
    'telefono01',
    'direccion_vendedor_01'
);

INSERT INTO ventas (
    id,
    id_cliente,
    fecha,
    numero_factura,
    monto_total,
    plazo,
    tipo,
    cedula_vendedor,
    id_sucursal
) VALUES (
    '1',
    '1',
    SYSDATE,
    '1',
    '100000',
    '1',
    't1',
    '4993886',
    '1'
);

之后我需要像这样修改cedula和cedula_vendedor列:

ALTER TABLE vendedores MODIFY
    cedula VARCHAR2(11);

ALTER TABLE ventas MODIFY
    cedula_vendedor VARCHAR2(11);

但是我收到以下错误:

Error starting at line : 276 in command -
ALTER TABLE vendedores MODIFY
    cedula VARCHAR2(11)
Error report -
ORA-02267: column type incompatible with referenced column type
02267. 00000 -  "column type incompatible with referenced column type"
*Cause:    The datatype of the referencing column is incompatible with the

Error starting at line : 279 in command -
ALTER TABLE ventas MODIFY
    cedula_vendedor VARCHAR2(11)
Error report -
ORA-02267: column type incompatible with referenced column type
02267. 00000 -  "column type incompatible with referenced column type"
*Cause:    The datatype of the referencing column is incompatible with the

好吧,我知道我可以用varchar2数据类型创建一个辅助列并传递所有数据,删除旧列并再次创建约束但是没有更直接的方法来重新定义列?

答案

错误消息是由表CONSTRAINT fk_ventas_vendedores FOREIGN KEY ( cedula_vendedor ) REFERENCES vendedores ( cedula )中的ventas引起的。

ALTER语句之前添加以下drop constraint语句,您将得到一个不同的错误:“要修改的列必须为空才能更改数据类型”。

ALTER TABLE ventas DROP CONSTRAINT fk_ventas_vendedores;

请参阅:Oracle SQL to change column type from number to varchar2 while it contains data

以上是关于在包含数据的同时修改表的列,从数字到varchar2直接的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 在包含数据时将列类型从数字更改为 varchar2

使用sql更改表的列的数据类型和添加新列和约束

数据库表的列类型转换

数据类型从 varchar2 到日期、数字等的隐式转换

更改表以修改未终止的列类型

更改列名的几种方法在数据库中