

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# ALTER TABLE 示例
<a name="r_ALTER_TABLE_examples_basic"></a>

以下示例演示了 ALTER TABLE 命令的基本用法。

## 重命名表或视图
<a name="r_ALTER_TABLE_examples_basic-rename-a-table"></a>

以下命令将 USERS 表重命名为 USERS\$1BKUP：

```
alter table users
rename to users_bkup;
```

 您还可以使用此类型的命令来重命名视图。

## 更改表或视图的所有者
<a name="r_ALTER_TABLE_examples_basic-change-the-owner-of-a-table-or-view"></a>

以下命令将 VENUE 表所有者更改为用户 DWUSER：

```
alter table venue
owner to dwuser;
```

以下命令创建一个视图，然后更改其所有者：

```
create view vdate as select * from date;
alter table vdate owner to vuser;
```

## 重命名列
<a name="r_ALTER_TABLE_examples_basic-rename-a-column"></a>

以下命令将 VENUE 表中的 VENUESEATS 列重命名为 VENUESIZE：

```
alter table venue
rename column venueseats to venuesize;
```

## 删除表约束
<a name="r_ALTER_TABLE_examples_drop-constraint"></a>

要删除表约束（例如主键、外键或唯一约束），请先查找约束的内部名称。然后在 ALTER TABLE 命令中指定约束名称。以下示例查找 CATEGORY 表的约束，然后删除名为 `category_pkey` 的主键。

```
select constraint_name, constraint_type
from information_schema.table_constraints
where constraint_schema ='public'
and table_name = 'category';

constraint_name | constraint_type
----------------+----------------
category_pkey   | PRIMARY KEY

alter table category
drop constraint category_pkey;
```

## 更改 VARCHAR 列
<a name="r_ALTER_TABLE_examples_alter-column"></a>

为了节省存储空间，您最初可以使用 VARCHAR 列定义一个表，这些列具有满足当前数据要求所需的最小大小。以后，要容纳更长的字符串，您可以更改表以增加列大小。

以下示例将 EVENTNAME 列大小增加到 VARCHAR(300)。

```
alter table event alter column eventname type varchar(300);
```

## 更改 VARBYTE 列
<a name="r_ALTER_TABLE_examples_alter-varbyte-column"></a>

为了节省存储空间，您最初可以使用 VARBYTE 列定义一个表，这些列具有满足当前数据要求所需的最小大小。以后，要容纳更长的字符串，您可以更改表以增加列大小。

以下示例将 EVENTNAME 列大小增加到 VARBYTE(300)。

```
alter table event alter column eventname type varbyte(300);
```

## 更改列的压缩编码
<a name="r_ALTER_TABLE_examples_alter-column-encoding"></a>

您可以更改列的压缩编码。您可以在下面找到一组演示此方法的示例。这些示例的表定义如下。

```
create table t1(c0 int encode lzo, c1 bigint encode zstd, c2 varchar(16) encode lzo, c3 varchar(32) encode zstd);
```

以下语句将列 c0 的压缩编码从 LZO 编码更改为 AZ64 编码。

```
alter table t1 alter column c0 encode az64;
```

以下语句将列 c1 的压缩编码从 Zstandard 编码更改为 AZ64 编码。

```
alter table t1 alter column c1 encode az64;
```

以下语句将列 c2 的压缩编码从 LZO 编码更改为 Byte-dictionary 编码。

```
alter table t1 alter column c2 encode bytedict;
```

以下语句将列 c3 的压缩编码从 Zstandard 编码更改为 Runlength 编码。

```
alter table t1 alter column c3 encode runlength;
```

## 修改 DISTSTYLE KEY DISTKEY 列
<a name="r_ALTER_TABLE_examples_alter-distkey"></a>

以下示例显示如何更改表的 DISTSTYLE 和 DISTKEY。

使用 EVEN 分配样式创建表 SVV\$1TABLE\$1INFO 视图显示 DISTSTYLE 为 EVEN。

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

将表 DISTKEY 更改为 `inv_warehouse_sk`。SVV\$1TABLE\$1INFO 视图将 `inv_warehouse_sk` 列显示为结果分配密钥。

```
alter table inventory alter diststyle key distkey inv_warehouse_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_warehouse_sk)
```

将表 DISTKEY 更改为 `inv_item_sk`。SVV\$1TABLE\$1INFO 视图将 `inv_item_sk` 列显示为结果分配密钥。

```
alter table inventory alter distkey inv_item_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_item_sk)
```

## 将表更改为 DISTSTYLE ALL
<a name="r_ALTER_TABLE_examples_alter-diststyle-all"></a>

以下示例演示如何将表更改为 DISTSTYLE ALL。

使用 EVEN 分配样式创建表 SVV\$1TABLE\$1INFO 视图显示 DISTSTYLE 为 EVEN。

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

将表 DISTSTYLE 更改为 ALL。SVV\$1TABLE\$1INFO 视图显示已更改的 DISTSYTLE。

```
alter table inventory alter diststyle all;

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     ALL
```

## 更改表 SORTKEY
<a name="r_ALTER_TABLE_examples_alter-sortkey"></a>

您可以将表更改为具有复合排序键或没有排序键。

在以下表定义中，表 `t1` 是使用交错排序键定义的。

```
create table t1 (c0 int, c1 int) interleaved sortkey(c0, c1);
```

以下命令将表从交错排序键更改为复合排序键。

```
alter table t1 alter sortkey(c0, c1);
```

以下命令对表进行了修改，删除了交错排序键。

```
alter table t1 alter sortkey none;
```

在以下表定义中，表 `t1` 将列 `c0` 定义为排序键。

```
create table t1 (c0 int, c1 int) sortkey(c0);
```

以下命令将表 `t1` 更改为复合排序键。

```
alter table t1 alter sortkey(c0, c1);
```

## 将表更改为 ENCODE AUTO
<a name="r_ALTER_TABLE_examples_alter-encode-auto"></a>

以下示例说明如何将表更改为 ENCODE AUTO。

此示例的表定义如下。列 `c0` 使用编码类型 AZ64 进行定义，列 `c1` 使用编码类型 LZO 定义。

```
create table t1(c0 int encode AZ64, c1 varchar encode LZO);
```

对于此表，以下语句将编码更改为 AUTO。

```
alter table t1 alter encode auto;
```

以下示例说明如何将表更改为删除 ENCODE AUTO 设置。

此示例的表定义如下。表列没有定义编码。在这种情况下，编码默认为 ENCODE AUTO。

```
create table t2(c0 int, c1 varchar);
```

对于此表，以下语句将 c0 列的编码更改为 LZO。表编码不再设置为 ENCODE AUTO。

```
alter table t2 alter column c0 encode lzo;;
```

## 修改行级别安全性控制
<a name="r_ALTER_TABLE_examples_basic-rls"></a>

以下命令将对表关闭 RLS：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY OFF;
```

以下命令将对表开启 RLS：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
```

以下命令将对表开启 RLS，使其可通过数据共享进行访问：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES OFF;
```

以下命令将对表开启 RLS，使其无法通过数据共享进行访问：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES ON;
```

以下命令将对表开启 RLS，并将表的 RLS 联接类型设置为 OR：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE OR;
```

以下命令将对表开启 RLS，并将表的 RLS 联接类型设置为 AND：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE AND;
```