【问题标题】:altering the data type of a column更改列的数据类型
【发布时间】:2019-07-08 08:16:01
【问题描述】:

在这个问题的前一部分中,我必须创建一个 PHONE_LIST_TYPE varray(3)。

A.使用属性 COUNTRY_CODE、AREA_CODE 和 PHONE_NUMBER 定义一个名为 phone_type 的用户定义对象类型数据类型。

B. 将名为 Phone_List_type 的用户定义的 VARRAY 数据类型定义为 phone_type 类型的大小为 3 的数组。

CREATE OR REPLACE TYPE phone_list_type AS VARRAY(3) of PHONE_TYPE

c.修改表 STUDENT1,使属性 PHONE 的数据类型为 Phone_List_type。

ALTER TABLE student1
ALTER COLUMN phone phone_list_type not null;

alter 列部分下有一个语法错误行,我不知道如何解决这个错误。

【问题讨论】:

  • 根据您的数据库(Oracle、MySql、Postgre 等),您需要使用 ALTER TABLE name ALTER COLUMN ....ALTER TABLE name MODIFY COLUMN ....ALTER TABLE name MODIFY ... 语法,因为每个数据库使用的语法略有不同 - 请参阅此链接详情:w3schools.com/sql/sql_alter.asp

标签: sql oracle ddl user-defined-types


【解决方案1】:

假设你以前有:

CREATE TYPE PHONE_TYPE AS OBJECT ( COUNTRY_CODE int, 
                                   AREA_CODE    int,
                                   PHONE_NUMBER varchar2(15) );

CREATE TABLE student1( id int, phone varchar2(15) );

为了能够更改数据类型,您通常需要以下语法:

ALTER TABLE student1
MODIFY ( phone phone_type );

但在这种情况下,您会得到 ORA-22858 : invalid alter of datatype 错误。因为不可能以经典方式将具有基本类型(字符串,数字...)的列转换为复合列(顺便说一下,在这种情况下,数据类型的列将被转换应该是空的)。

所以,添加一个具有临时名称的新列:

ALTER TABLE student1 ADD (phone2 phone_type);

然后,用现有数据填充该新列的 phone_number 组件:

UPDATE student1 s 
   SET s.phone2.phone_number = phone;

最后,删除并使用列的现有名称重命名:

ALTER TABLE student1 DROP COLUMN phone;
ALTER TABLE student1 RENAME COLUMN phone2 TO phone;

【讨论】:

    【解决方案2】:

    取决于您使用的数据库。以下是最常见的:

    SQL Server/MS 访问:

    ALTER TABLE student1
    ALTER COLUMN phone phone_list_type NOT NULL;
    

    My SQL / Oracle(10G 之前):

    ALTER TABLE student1
    MODIFY COLUMN phone phone_list_type NOT NULL;
    

    Oracle 10G 及更高版本:

    ALTER TABLE student1
    MODIFY phone phone_list_type NOT NULL;
    

    【讨论】:

    • 这三种方法我都试过了。如果我使用 SQL 服务器方法,那么在 alter 列中的 alter 下会有一条红线。如果我使用 MY SQL 方法,那么 phone_list_type 下会有一条错误行。记录的错误是:“检查编译器日志”
    • 你还没有透露你使用的是哪个数据库
    • oracle SQL 开发者
    • 你是如何创建类型“phone_list_type”的?您可以编辑问题并将其添加到那里吗?