管理表名称

本页面介绍了如何重命名表,以及如何在 GoogleSQL 方言数据库和 PostgreSQL 方言数据库中添加、使用和删除表同义词。

表重命名和同义词选项

您可以使用 ALTER TABLE 语句执行以下操作:

使用同义词重命名表的工作原理

一种常见场景是重命名表并添加包含旧表名称的同义词。重命名表后,您可以更新应用,以便在您的时间表中使用新名称。在此期间,有些应用可能会使用旧名称,有些应用可能会使用新名称。

将所有应用都更新为使用新名称后,我们建议您移除同义词。虽然使用同义词不会影响性能,但在同义词被舍弃之前,您无法在其他地方使用旧名称。

同义词以 synonym 对象的形式存储在架构中。一个表只能有一个同义词。

如需了解详情,请参阅重命名表并添加同义词

表名称交换的工作原理

如果需要在两个表之间交换名称,您可以将 RENAME TO 语句链接在一起,以便在同一语句中重命名两个表。这样,您就可以在不中断的情况下将应用关联到其他表。

如需了解详情,请参阅交换表名称

表重命名的工作原理

重命名表时,Spanner 会更改表架构中的表名称。重命名表会将所有子表与新表名称交织。表重命名还会更改对以下内容的表的引用:

  • 索引
  • 外键
  • 变更流
  • 精细访问权限控制 (FGAC)

Spanner 不会自动更新视图以使用新表名称。

如需了解详情,请参阅重命名表

表重命名限制

表重命名有以下限制:

  • 如果表与另一个表交织,则无法将表重命名为该表中列的名称。
  • 您无法重命名索引。如需更改索引的名称,请先删除该索引,然后使用新名称重新创建索引。
  • 如果表具有视图,您可能需要先删除该视图,然后在重命名表后重新创建视图。

同义词的工作原理

您可以创建包含同义词的新表,也可以修改表以向其中添加同义词,而无需重命名表。您可能需要执行此操作的场景是,您希望在生产环境和测试环境中都使用一个数据库。

如需了解详情,请参阅向表添加同义词

权限

如需重命名表或为表添加同义词,您需要拥有 spanner.databases.updateDdl 权限。如需查看或修改您的权限,请参阅向主账号授予权限

重命名表并添加同义词

GoogleSQL

使用 ALTER TABLE RENAME TO ADD SYNONYM 重命名表并添加同义词。

  ALTER TABLE table_name RENAME TO new_table_name, ADD SYNONYM table_name;

PostgreSQL

使用 ALTER TABLE RENAME WITH ADD SYNONYM 重命名表并添加同义词。

  ALTER TABLE table_name RENAME WITH SYNONYM TO new_table_name;

以下示例展示了如何重命名表并添加同义词。例如,如果您使用以下 DDL 创建表:

GoogleSQL

  CREATE TABLE Singers (
      SingerId INT64 NOT NULL,
      SingerName STRING(1024)
  ), PRIMARY KEY (SingerId);

PostgreSQL

  CREATE TABLE singers (
      singer_id BIGINT,
      singer_name VARCHAR(1024),
      PRIMARY KEY (singer_id));

您可以发出以下 DDL 请求来重命名表,并将现有名称移至 synonym 对象。

GoogleSQL

  ALTER TABLE Singers RENAME TO SingersNew, ADD SYNONYM Singers;

PostgreSQL

  ALTER TABLE singers RENAME WITH SYNONYM TO singers_new;

交换表名称

以下 DDL 语句会原子性地更改多个表的名称。在一个或多个表对之间交换名称时,此方法非常有用。

GoogleSQL

使用RENAME TABLE

  RENAME TABLE old_name1 TO new_name1 [,old_name2 TO new_name2 ...];

PostgreSQL

使用ALTER TABLE RENAME TO

  ALTER TABLE [ IF EXISTS ] [ ONLY ] table_name1
        RENAME TO new_table_name1
        [, ALTER TABLE [ IF EXISTS ] [ ONLY ] table_name2
              RENAME TO new_table_name2 ...];

以下示例展示了如何交换两个表的名称。这需要将第一个表重命名为临时名称,将第二个表重命名为第一个表的名称,然后将第一个表重命名为第二个表的名称。

如果您已创建如下所示的两个表:

GoogleSQL

  CREATE TABLE Singers (
        SingerId INT64 NOT NULL,
        SingerName STRING(1024)
        ), PRIMARY KEY (SingerId);

  CREATE TABLE SingersNew (
        SingerId INT64 NOT NULL,
        FirstName STRING(1024),
        MiddleName STRING(1024),
        LastName STRING(1024)
        ), PRIMARY KEY (SingerId);

PostgreSQL

  CREATE TABLE singers (
        singer_id BIGINT,
        singer_name VARCHAR(1024),
        PRIMARY KEY (singer_id)
        );

  CREATE TABLE singers_new (
        singer_id BIGINT,
        first_name VARCHAR(1024),
        middle_name VARCHAR(1024),
        last_name VARCHAR(1024)
        PRIMARY KEY (singer_id)
        );

您可以使用以下 DDL 请求来交换表名称:

GoogleSQL

  RENAME TABLE Singers TO Temp, SingersNew TO Singers, Temp TO SingersNew;

PostgreSQL

  ALTER TABLE singers RENAME TO temp,
        ALTER TABLE singers_new RENAME TO singers,
        ALTER TABLE temp RENAME TO singers_new;

应用 DDL 语句后,表名称会互换,如下所示:

GoogleSQL

  CREATE TABLE Singers (
        SingerId INT64 NOT NULL,
        FirstName STRING(1024),
        MiddleName STRING(1024),
        LastName STRING(1024)
        ), PRIMARY KEY (SingerId);

  CREATE TABLE SingersNew (
        SingerId INT64 NOT NULL,
        SingerName STRING(1024)
        ), PRIMARY KEY (SingerId);

PostgreSQL

  CREATE TABLE singers (
        singer_id BIGINT,
        first_name VARCHAR(1024),
        middle_name VARCHAR(1024),
        last_name VARCHAR(1024)
        PRIMARY KEY (singer_id)
        );

  CREATE TABLE singers_new (
        singer_id BIGINT,
        singer_name VARCHAR(1024),
        PRIMARY KEY (singer_id)
        );

重命名表

如需重命名表,请使用以下语法:

GoogleSQL

使用 ALTER NAMERENAME TABLE 语句。

  ALTER TABLE table_name RENAME TO new_table_name;
  RENAME TABLE table_name TO new_table_name;

PostgreSQL

使用 ALTER TABLE RENAME TO 语句。

  ALTER TABLE [ IF EXISTS ] [ ONLY ] table_name
        RENAME TO new_table_name;

以下示例展示了用于重命名表的 DDL 请求:

GoogleSQL

  RENAME TABLE Singers TO SingersNew;

PostgreSQL

  ALTER TABLE singers RENAME TO singers_new;

向表添加同义词

如需向表添加同义词,请执行以下操作:

GoogleSQL

  ALTER TABLE table_name ADD SYNONYM synonym;

PostgreSQL

  ALTER TABLE [ IF EXISTS ] [ ONLY ] table_name ADD SYNONYM synonym;

以下示例展示了向表中添加同义词的 DDL 请求:

GoogleSQL

  ALTER TABLE Singers ADD SYNONYM SingersTest;

PostgreSQL

  ALTER TABLE singers ADD SYNONYM singers_test;

创建包含同义词的表

如需创建包含同义词的表,请执行以下操作:

GoogleSQL

使用CREATE TABLE SYNONYM synonym_name

  CREATE TABLE table_name (
      ...
      SYNONYM (synonym)
  ) PRIMARY KEY (primary_key);

PostgreSQL

使用CREATE TABLE SYNONYM synonym_name

  CREATE TABLE table_name (
      ...
      SYNONYM (synonym),
      PRIMARY KEY (primary_key));

以下示例创建了一个表并添加了同义词。

GoogleSQL

  # The table's name is Singers and the synonym is Artists.
  CREATE TABLE Singers (
      SingerId INT64 NOT NULL,
      SingerName STRING(1024),
      SYNONYM (Artists)
  ) PRIMARY KEY (SingerId);

PostgreSQL

  # The table's name is singers and the synonym is artists.
  CREATE TABLE singers (
      singer_id BIGINT,
      singer_name VARCHAR(1024),
      SYNONYM (artists),
      PRIMARY KEY (singer_id));

从表中移除同义词

GoogleSQL

使用 ALTER TABLE DROP SYNONYM 从表中移除同义词。

  ALTER TABLE table_name DROP SYNONYM synonym;

PostgreSQL

使用 ALTER TABLE DROP SYNONYM 从表中移除同义词。

  ALTER TABLE [ IF EXISTS ] [ ONLY ] table_name DROP SYNONYM synonym;

以下示例展示了从表中删除同义词的 DDL 请求:

GoogleSQL

  ALTER TABLE Singers DROP SYNONYM SingersTest;

PostgreSQL

  ALTER TABLE singers DROP SYNONYM singers_test;