更改和删除数据库架构中的对象

本页概述了如何更改和删除数据库模式中的对象。

准备

在阅读本页之前,请执行以下操作:

  • 创建hubble集群或启动本地集群。
  • 查看数据库架构对象。
  • 创建数据库。
  • 创建用户定义的架构。
  • 创建一个表。
  • 添加二级索引。
  • 改变数据库。

改变数据库模式对象

要更改数据库模式中的现有对象,使用ALTER语句。

ALTER语句通常采用以下形式:

ALTER {OBJECT_TYPE} {OBJECT_NAME} {SUBCOMMAND};
范围描述
{OBJECT_TYPE}对象的类型。
{OBJECT_NAME}对象的名称。
{SUBCOMMAND}要进行的更改的子命令。

hubble支持以下ALTER语句:

  • ALTER DATABASE
  • ALTER SCHEMA
  • ALTER TABLE
  • ALTER INDEX
  • ALTER VIEW
  • ALTER SEQUENCE
  • ALTER TYPE
  • ALTER USER/ROLE

改变对象的例子

要对在创建表中创建的表进行一些更改。具体来说,执行以下操作:

  • 添加一个新列:name
  • 将表的主键中的更改为nameemail列。
  • 将表移动到abc_schema用户定义的模式。
  • 将表的所有者更改为abc

ALTER TABLE语句具有针对所有这些更改的子命令:

  • 要添加新列,请使用ADD COLUMN子命令。
  • 要更改表的主键列,请使用ALTER PRIMARY KEY子命令。
  • 要将表移动到不同的模式,请使用SET SCHEMA子命令。
  • 要更改表的所有者,请使用OWNER TO子命令。

以下示例说明

添加ALTER TABLE添加列的语句name

ALTER TABLE  cust_info ADD COLUMN name string;

添加另一个ALTER TABLE语句以将主键列更改为nameemail

ALTER TABLE  cust_info ALTER PRIMARY KEY USING COLUMNS (name, email);

为了将列添加到现有表的主键索引中,该列必须具有现有NOT NULL约束。综合来讲,添加一个子命令来设置列上的约束:

ALTER TABLE cust_info
  ADD   COLUMN name STRING NOT NULL,
  ALTER COLUMN email SET NOT NULL;

执行主键添加:

ALTER TABLE cust_info ALTER PRIMARY KEY USING COLUMNS (name, email);

更改模式的语句:

ALTER TABLE IF EXISTS cust_info SET SCHEMA abc_schema;

ALTER TABLE IF EXISTS test.abc_schema.cust_info OWNER TO abc;

删除数据库模式对象

要从数据库模式中删除对象,请使用DROP语句。

DROP语句通常采用以下形式:

DROP {OBJECT_TYPE} {OBJECT_NAME} CASCADE;
范围描述
{OBJECT_TYPE}对象的类型。
{OBJECT_NAME}对象的名称。
{CASCADE}一个可选的关键字,它将删除依赖于被删除对象的所有对象。

hubble支持以下DROP语句:

  • DROP DATABASE
  • DROP SCHEMA
  • DROP TABLE
  • DROP INDEX
  • DROP SEQUENCE
  • DROP VIEW
  • DROP USER/ROLE

删除最佳实践

  • 在使用该选项之前检查要删除的对象的内容和依赖项。CASCADE语句删除对象的所有内容,在模式初始化后应谨慎使用。

示例

假设想删除一个不经常使用的索引。

show indexes from cust_info;
 table_name  |           index_name               | non_unique | seq_in_index | column_name | direction | storing | implicit  | visible
-------------+--------------------------------+------------+--------------+-------------+-----------+---------+-----------+---------
  cust_info  | cust_info_pkey                     |    f       |            1 | name        | ASC       |   f     |    f      |   t
  cust_info  | cust_info_pkey                     |    f       |            2 | email       | ASC       |   f     |    f      |   t
  cust_info  | cust_info_first_name_last_name_key |    f       |            1 | first_name  | ASC       |   f     |    f      |   t
  cust_info  | cust_info_first_name_last_name_key |    f       |            2 | last_name   | ASC       |   f     |    f      |   t
  cust_info  | cust_info_first_name_last_name_key |    f       |            3 | name        | ASC       |   f     |    t      |   t
  cust_info  | cust_info_first_name_last_name_key |    f       |            4 | email       | ASC       |   f     |    t      |   t
  cust_info  | cust_info_email_key                |    f       |            1 | email       | ASC       |   f     |    f      |   t
  cust_info  | cust_info_email_key                |    f       |            2 | name        | ASC       |   f     |    t      |   t
show create table test.abc_schema.cust_info;
CREATE TABLE abc_schema.cust_info (
                               first_name STRING NOT NULL,
                               last_name STRING NOT NULL,
                               email STRING NOT NULL,
                               name STRING NOT NULL,
                               CONSTRAINT "primary" PRIMARY KEY (name ASC, email ASC),
                               UNIQUE INDEX cust_info_first_name_last_name_key (first_name ASC, last_name ASC),
                               UNIQUE INDEX cust_info_email_key (email ASC),
                               FAMILY "primary" (first_name, last_name, email, name)
                           );

cust_info_first_name_last_name_key是一个UNIQUE索引。

执行DROP语句:

DROP INDEX  test.abc_schema.cust_info@cust_info_first_name_last_name_key  CASCADE;