

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

# USE
<a name="r_USE_command"></a>

更改对其运行查询的数据库。SHOW USE 指向最近与 USE 命令一起使用的数据库。RESET USE 会重置所使用的数据库。这意味着，如果未在 SQL 中指定数据库，则将在当前数据库中搜索对象。

## 语法
<a name="r_USE-synopsis"></a>

```
USE database
```

## 示例
<a name="r_USE_command-examples"></a>

假设有三个数据库：`dev`、`pdb` 和 `pdb2`。假设每个数据库的公有架构中有两个表 `t`。首先，将数据插入不同数据库的表中：

```
dev=# insert into dev.public.t values (1);
INSERT 0 1
dev=# insert into pdb.public.t values (2);
INSERT 0 1
```

在未显式设置数据库的情况下，系统将使用已连接的数据库。检查当前数据库上下文：

```
dev=# show use;
Use Database

(1 row)
dev=> show search_path;
search_path
$user, public
(1 row)
```

在不指定数据库的情况下查询表 `t` 时，系统将使用当前数据库中的表：

```
dev=# select * from t;
c
----
1
(1 row)
```

使用 `use` 命令可在不更改连接的情况下切换数据库：

```
dev=# use pdb;
USE
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# select * from t;
id
----
2
(1 row)
```

还可以显式指定架构：

```
dev=# select * from public.t;
id
----
2
(1 row)
```

现在，您可以在当前数据库中使用不同的架构创建表：

```
dev=# create table s1.t(id int);
CREATE TABLE
dev=# insert into pdb.s1.t values (3);
INSERT 0 1
```

当您未指定架构时，搜索路径决定了可以访问哪个架构的对象：

```
dev=# set search_path to public, s1;
SET
dev=# select * from t;
 id
----
  2
(1 row)
```

更改架构的顺序以访问不同的表：

```
dev=# set search_path to s1, public;
SET
dev=# show search_path;
 search_path
-------------
 s1, public
(1 row)
dev=# select * from t;
 id
----
  3
(1 row)
```

在保持原始连接的同时切换到另一个数据库：

```
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# use pdb2;
USE
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)
```

切换数据库时，搜索路径会重置为默认值：

```
dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

在当前数据库中创建表并插入数据：

```
dev=# create table pdb2.public.t(id int);
CREATE TABLE
dev=# insert into pdb2.public.t values (4);
INSERT 0 1
dev=# select * from t;
 id
----
  4
(1 row)
```

在事务中，您可以使用由三部分组成的表示法来写入当前数据库并从任何数据库读取。这还包括连接的数据库：

```
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)

dev=# BEGIN;
BEGIN
dev=# select * from t;
 id
----
  4
(1 row)

dev=# insert into t values (5);
INSERT 0 1
dev=# select * from t;
 id
----
  4
  5
(2 rows)

dev=# select * from pdb.public.t;
 id
----
  2
(1 row)

dev=# select * from dev.public.t;
 id
----
  1
(1 row)
```

重置为连接的数据库。请注意，这不仅会恢复到以前使用的数据库 `pdb`，还会重置为连接的数据库。搜索路径也会更改为默认路径：

```
dev=# RESET USE;
RESET
dev=# select * from t;
c
----
1
(1 row)
dev=# show use;
 Use Database
--------------

(1 row)

dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

您可以在事务开始时更改数据库，但不能在运行查询之后更改数据库：

```
dev=# BEGIN;
BEGIN
dev=# use pdb;
USE
dev=# use pdb2;
USE
dev=# use pdb;
USE
dev=# select * from t;
 id
----
  2
(1 row)
dev=# use pdb2;
ERROR:  USEd Database cannot be set or reset inside a transaction after another command.
dev=# rollback;
ROLLBACK
(1 row)
```

### 数据目录示例
<a name="use-redlake-example"></a>

首先，在不同的架构和目录中创建表以演示跨目录查询。首先在连接的数据库中创建表。

```
dev=# CREATE TABLE dev.public.t (col INT);
dev=# INSERT INTO dev.public.t VALUES (1);
dev=# CREATE SCHEMA write_schema;
dev=# CREATE TABLE dev.write_schema.t (state char (2));
dev=# INSERT INTO dev.write_schema.t VALUES ('WA');
```

现在，在不同的目录中创建类似的表。这演示了如何使用跨目录数据库。

```
dev=# CREATE TABLE my_db@my_catalog.public.t (col INT);
dev=# INSERT INTO my_db@my_catalog.public.t VALUES (100);
dev=# CREATE SCHEMA my_db@my_catalog.write_schema;
dev=# CREATE TABLE my_db@my_catalog.write_schema.t (state char (2));
dev=# INSERT INTO my_db@my_catalog.write_schema.t VALUES ('CA');
```

检查当前数据库上下文。在未显式设置数据库的情况下，系统将使用连接的数据库。

```
dev=# SHOW USE;
 Use Database
--------------

(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)

dev=# SELECT * FROM t;
 col
-----
   1
(1 row)
```

将 USEd 数据库设置为查询其它目录中的表。

```
dev=# USE my_db@my_catalog;

dev=# SHOW USE;
            Use Database
-------------------------------------
 my_db@my_catalog
(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

查询表 t 时，结果来自跨目录数据库。

```
dev=# SELECT * FROM t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM my_db@my_catalog.public.t;
 col
-----
 100
(1 row)
```

更改搜索路径以访问 USEd 数据库内不同架构中的表。

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM my_db@my_catalog.write_schema.t;
 state
-------
 CA
(1 row)
```

即使 USE 设置为跨目录数据库，也仍然可以显式查询原始数据库。

```
dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

重置 USEd 数据库以再次引用所连接数据库中的对象。

```
dev=# RESET USE;

dev=# SHOW USE;
 Use Database
--------------

(1 row)
```

请注意，重置 USE 时，search\$1path 会重置。

```
dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

重置后，查询现在引用原始连接的数据库。

```
dev=# SELECT * FROM t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM dev.public.t;
 col
-----
   1
(1 row)
```

可以修改原始数据库中的搜索路径以访问不同的架构。

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```