

# Aurora PostgreSQL Limitless Database リファレンス
<a name="limitless-reference"></a>

Aurora PostgreSQL Limitless Database に関する以下のリファレンストピックを参照してください。

**Topics**
+ [サポートされている/サポートされていないデータ定義言語 (DDL) SQL コマンド](limitless-reference.DDL-support.md)
+ [Aurora PostgreSQL Limitless Database の DDL 制限とその他の情報](limitless-reference.DDL-limitations.md)
+ [サポートされている/サポートされていないデータ操作言語 (DML) とクエリ処理 SQL コマンド](limitless-reference.DML-support.md)
+ [Aurora PostgreSQL Limitless Database の DML 制限とその他の情報](limitless-reference.DML-limitations.md)
+ [Aurora PostgreSQL Limitless Database の変数](limitless-reference.variables.md)
+ [Aurora PostgreSQL Limitless Database の DB クラスターパラメータ](limitless-reference.DBCparams.md)

# サポートされている/サポートされていないデータ定義言語 (DDL) SQL コマンド
<a name="limitless-reference.DDL-support"></a>

次の表では、Aurora PostgreSQL Limitless Database でサポートされている/サポートされていない DDL コマンドと、制限事項や詳細情報を示します。


| コマンド | サポート対象? | 制限事項または詳細情報 | 
| --- | --- | --- | 
| ALTER AGGREGATE | いいえ | 該当しない | 
| ALTER COLLATION | あり | なし | 
| ALTER CONVERSION | あり | なし | 
| ALTER DATABASE | いいえ | 該当しない | 
| ALTER DEFAULT PRIVILEGES | いいえ | 該当しない | 
| ALTER DOMAIN | いいえ | 該当しない | 
| ALTER EVENT TRIGGER | いいえ | 該当しない | 
| ALTER EXTENSION | あり | [拡張子](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Extensions) | 
| ALTER FOREIGN DATA WRAPPER | いいえ | 該当しない | 
| ALTER FOREIGN TABLE | いいえ | 該当しない | 
| ALTER FUNCTION | あり | [関数](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Functions) | 
| ALTER GROUP | あり | なし | 
| ALTER INDEX | あり | なし | 
| ALTER LANGUAGE | いいえ | 該当しない | 
| ALTER LARGE OBJECT | いいえ | 該当しない | 
| ALTER MATERIALIZED VIEW | いいえ | 該当しない | 
| ALTER OPERATOR | あり | なし | 
| ALTER OPERATOR CLASS | あり | なし | 
| ALTER OPERATOR FAMILY | あり | なし | 
| ALTER POLICY | いいえ | 該当しない | 
| ALTER PROCEDURE | あり | なし | 
| ALTER PUBLICATION | いいえ | 該当しない | 
| ALTER ROLE | あり | なし | 
| ALTER ROUTINE | いいえ | 該当しない | 
| ALTER RULE | いいえ | 該当しない | 
| ALTER SCHEMA | あり | なし | 
| ALTER SEQUENCE | あり | [シーケンス](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Sequences) | 
| ALTER SERVER | いいえ | 該当しない | 
| ALTER STATISTICS | いいえ | 該当しない | 
| ALTER SUBSCRIPTION | いいえ | 該当しない | 
| ALTER SYSTEM | いいえ | 該当しない | 
| ALTER TABLE | あり | [ALTER TABLE](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.ALTER_TABLE) | 
| ALTER TABLESPACE | いいえ | 該当しない | 
| ALTER TEXT SEARCH CONFIGURATION | いいえ | 該当しない | 
| ALTER TEXT SEARCH DICTIONARY | いいえ | 該当しない | 
| ALTER TEXT SEARCH PARSER | いいえ | 該当しない | 
| ALTER TEXT SEARCH TEMPLATE | いいえ | 該当しない | 
| ALTER TRIGGER | いいえ | 該当しない | 
| ALTER TYPE | あり | なし | 
| ALTER USER | あり | なし | 
| ALTER USER MAPPING | いいえ | 該当しない | 
| ALTER VIEW | あり | なし | 
| COMMENT | いいえ | 該当しない | 
| CREATE ACCESS METHOD | いいえ | 該当しない | 
| CREATE AGGREGATE | いいえ | 該当しない | 
| CREATE CAST | あり | なし | 
| CREATE COLLATION | あり | なし | 
| CREATE CONVERSION | あり | なし | 
| CREATE DATABASE | あり | [CREATE DATABASE](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.CREATE_DATABASE) | 
| CREATE DOMAIN | いいえ | 該当しない | 
| CREATE EVENT TRIGGER | いいえ | 該当しない | 
| CREATE EXTENSION | あり | [拡張子](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Extensions) | 
| CREATE FOREIGN DATA WRAPPER | いいえ | 該当しない | 
| CREATE FOREIGN TABLE | いいえ | 該当しない | 
| CREATE FUNCTION | あり | [関数](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Functions) | 
| CREATE GROUP | あり | なし | 
| CREATE INDEX | あり | [CREATE INDEX](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.CREATE_INDEX) | 
| CREATE LANGUAGE | いいえ | 該当しない | 
| CREATE MATERIALIZED VIEW | いいえ | 該当しない | 
| CREATE OPERATOR | あり | なし | 
| CREATE OPERATOR CLASS | あり | なし | 
| CREATE OPERATOR FAMILY | あり | なし | 
| CREATE POLICY | あり | なし | 
| CREATE PROCEDURE | あり | なし | 
| CREATE PUBLICATION | いいえ | 該当しない | 
| CREATE ROLE | あり | なし | 
| CREATE RULE | いいえ | 該当しない | 
| CREATE SCHEMA | あり | [CREATE SCHEMA](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.CREATE_SCHEMA) | 
| CREATE SEQUENCE | あり | [シーケンス](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Sequences) | 
| CREATE SERVER | いいえ | 該当しない | 
| CREATE STATISTICS | いいえ | 該当しない | 
| CREATE SUBSCRIPTION | いいえ | 該当しない | 
| CREATE TABLE | あり | [CREATE TABLE](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.CREATE_TABLE) | 
| CREATE TABLE AS | あり | [CREATE TABLE AS](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.CREATE_TABLE_AS) | 
| CREATE TABLESPACE | いいえ | 該当しない | 
| CREATE TEMPORARY TABLE | いいえ | 該当しない | 
| CREATE TEMPORARY TABLE AS | いいえ | 該当しない | 
| CREATE TEXT SEARCH CONFIGURATION | いいえ | 該当しない | 
| CREATE TEXT SEARCH DICTIONARY | いいえ | 該当しない | 
| CREATE TEXT SEARCH PARSER | いいえ | 該当しない | 
| CREATE TEXT SEARCH TEMPLATE | いいえ | 該当しない | 
| CREATE TRANSFORM | いいえ | 該当しない | 
| CREATE TRIGGER | いいえ | 該当しない | 
| CREATE TYPE | あり | なし | 
| 「ユーザーの作成」 | あり | なし | 
| CREATE USER MAPPING | いいえ | 該当しない | 
| CREATE VIEW | あり | なし | 
| DROP ACCESS METHOD | いいえ | 該当しない | 
| DROP AGGREGATE | あり | なし | 
| DROP CAST | あり | なし | 
| DROP COLLATION | あり | なし | 
| DROP CONVERSION | あり | なし | 
| DROP DATABASE | あり | [DROP DATABASE](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.DROP_DATABASE) | 
| DROP DOMAIN | いいえ | 該当しない | 
| DROP EVENT TRIGGER | いいえ | 該当しない | 
| DROP EXTENSION | あり | [拡張子](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Extensions) | 
| DROP FOREIGN DATA WRAPPER | いいえ | 該当しない | 
| DROP FOREIGN TABLE | いいえ | 該当しない | 
| DROP FUNCTION | あり | [関数](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Functions) | 
| DROP GROUP | あり | なし | 
| DROP INDEX | あり | なし | 
| DROP LANGUAGE | いいえ | 該当しない | 
| DROP MATERIALIZED VIEW | いいえ | 該当しない | 
| DROP OPERATOR | あり | なし | 
| DROP OPERATOR CLASS | あり | なし | 
| DROP OPERATOR FAMILY | あり | なし | 
| DROP OWNED | いいえ | 該当しない | 
| DROP POLICY | いいえ | 該当しない | 
| DROP PROCEDURE | あり | なし | 
| DROP PUBLICATION | いいえ | 該当しない | 
| DROP ROLE | あり | なし | 
| DROP ROUTINE | いいえ | 該当しない | 
| DROP RULE | いいえ | 該当しない | 
| DROP SCHEMA | あり | なし | 
| DROP SEQUENCE | あり | なし | 
| DROP SERVER | いいえ | 該当しない | 
| DROP STATISTICS | いいえ | 該当しない | 
| DROP SUBSCRIPTION | いいえ | なし | 
| DROP TABLE | あり | なし | 
| DROP TABLESPACE | いいえ | 該当しない | 
| DROP TEXT SEARCH CONFIGURATION | いいえ | 該当しない | 
| DROP TEXT SEARCH DICTIONARY | いいえ | 該当しない | 
| DROP TEXT SEARCH PARSER | いいえ | 該当しない | 
| DROP TEXT SEARCH TEMPLATE | いいえ | 該当しない | 
| DROP TRANSFORM | いいえ | 該当しない | 
| DROP TRIGGER | いいえ | 該当しない | 
| DROP TYPE | あり | なし | 
| DROP USER | あり | なし | 
| DROP USER MAPPING | いいえ | 該当しない | 
| DROP VIEW | あり | なし | 
| GRANT | あり | なし | 
| REASSIGN OWNED | いいえ | 該当しない | 
| REVOKE | あり | なし | 
| SECURITY LABEL | いいえ | 該当しない | 
| SELECT INTO | あり | [SELECT INTO](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.SELECT_INTO) | 
| SET | あり | なし | 
| SET CONSTRAINTS | いいえ | 該当しない | 
| SET ROLE | あり | なし | 
| SET SESSION AUTHORIZATION | あり | なし | 
| SET TRANSACTION | あり | なし | 
| TRUNCATE | あり | なし | 

# Aurora PostgreSQL Limitless Database の DDL 制限とその他の情報
<a name="limitless-reference.DDL-limitations"></a>

以下のトピックでは、Aurora PostgreSQL Limitless Database の DDL SQL コマンドの制限や詳細について説明します。

**Topics**
+ [ALTER TABLE](#limitless-reference.DDL-limitations.ALTER_TABLE)
+ [CREATE DATABASE](#limitless-reference.DDL-limitations.CREATE_DATABASE)
+ [CREATE INDEX](#limitless-reference.DDL-limitations.CREATE_INDEX)
+ [CREATE SCHEMA](#limitless-reference.DDL-limitations.CREATE_SCHEMA)
+ [CREATE TABLE](#limitless-reference.DDL-limitations.CREATE_TABLE)
+ [CREATE TABLE AS](#limitless-reference.DDL-limitations.CREATE_TABLE_AS)
+ [DROP DATABASE](#limitless-reference.DDL-limitations.DROP_DATABASE)
+ [SELECT INTO](#limitless-reference.DDL-limitations.SELECT_INTO)
+ [制約](#limitless-reference.DDL-limitations.Constraints)
+ [デフォルト値](#limitless-reference.DDL-limitations.DefaultValues)
+ [拡張子](#limitless-reference.DDL-limitations.Extensions)
+ [外部キー](#limitless-reference.DDL-limitations.FKs)
+ [関数](#limitless-reference.DDL-limitations.Functions)
+ [シーケンス](#limitless-reference.DDL-limitations.Sequences)

## ALTER TABLE
<a name="limitless-reference.DDL-limitations.ALTER_TABLE"></a>

`ALTER TABLE` コマンドは、Aurora PostgreSQL Limitless Database で一般的にサポートされています。詳細については、PostgreSQL ドキュメントの「[ALTER TABLE](https://www.postgresql.org/docs/current/sql-altertable.html)」を参照してください。

### 制限
<a name="limitless-reference.ALTER_TABLE.limitations"></a>

`ALTER TABLE` には、サポートされるオプションについて以下の制限があります。

**列の削除**  
+ シャードテーブルでは、シャードキーの一部である列を削除することはできません。
+ リファレンステーブルでは、プライマリキー列を削除することはできません。

**列のデータ型の変更**  
+ `USING` 式はサポートされません。
+ シャードテーブルでは、シャードキーの一部である列のタイプを変更することはできません。

**制約の追加または削除**  
サポートされていない項目の詳細については、「[制約](#limitless-reference.DDL-limitations.Constraints)」を参照してください。

**列のデフォルト値の変更**  
デフォルト値がサポートされています。詳細については、「[デフォルト値](#limitless-reference.DDL-limitations.DefaultValues)」を参照してください。

### サポートされていないオプション
<a name="limitless-reference.ALTER_TABLE.unsupported"></a>

一部のオプションは、トリガーなどのサポートされていない機能に依存するため、サポートされていません。

次の `ALTER TABLE` のテーブルレベルのオプションはサポートされていません。
+ `ALL IN TABLESPACE`
+ `ATTACH PARTITION`
+ `DETACH PARTITION`
+ `ONLY` フラグ
+ `RENAME CONSTRAINT`

次の `ALTER TABLE` の列レベルのオプションはサポートされていません。
+ ADD GENERATED
+ DROP EXPRESSION [ IF EXISTS ]
+ DROP IDENTITY [ IF EXISTS ]
+ RESET
+ RESTART
+ SET
+ SET COMPRESSION
+ SET STATISTICS

## CREATE DATABASE
<a name="limitless-reference.DDL-limitations.CREATE_DATABASE"></a>

Aurora PostgreSQL Limitless Database では、制限のないデータベースのみがサポートされています。

`CREATE DATABASE` の実行中に、1 つ以上のノードで正常に作成されたデータベースが、他のノードで失敗することがあります。これは、データベースの作成が非トランザクションオペレーションであるためです。この場合、DB シャードグループの一貫性を維持するために、正常に作成されたデータベースオブジェクトは、事前指定された時間内にすべてのノードから自動的に削除されます。この間、同じ名前のデータベースを再作成すると、データベースが既に存在することを示すエラーが発生する可能性があります。

以下のオペレーションがサポートされています。
+ 照合:

  ```
  CREATE DATABASE name WITH 
      [LOCALE = locale]
      [LC_COLLATE = lc_collate]
      [LC_CTYPE = lc_ctype]
      [ICU_LOCALE = icu_locale]
      [ICU_RULES = icu_rules]
      [LOCALE_PROVIDER = locale_provider]
      [COLLATION_VERSION = collation_version];
  ```
+ `CREATE DATABASE WITH OWNER`:

  ```
  CREATE DATABASE name WITH OWNER = user_name;
  ```

次のオプションはサポートされていません。
+ `CREATE DATABASE WITH TABLESPACE`:

  ```
  CREATE DATABASE name WITH TABLESPACE = tablespace_name;
  ```
+ `CREATE DATABASE WITH TEMPLATE`:

  ```
  CREATE DATABASE name WITH TEMPLATE = template;
  ```

## CREATE INDEX
<a name="limitless-reference.DDL-limitations.CREATE_INDEX"></a>

`CREATE INDEX CONCURRENTLY` はシャードテーブルでサポートされています。

```
CREATE INDEX CONCURRENTLY index_name ON table_name(column_name);
```

`CREATE UNIQUE INDEX` は、すべてのテーブルタイプでサポートされています。

```
CREATE UNIQUE INDEX index_name ON table_name(column_name);
```

`CREATE UNIQUE INDEX CONCURRENTLY` はサポートされていません。

```
CREATE UNIQUE INDEX CONCURRENTLY index_name ON table_name(column_name);
```

詳細については、「[UNIQUE](#unique-constraint)」を参照してください。インデックスの作成に関する一般的な情報については、PostgreSQL ドキュメントの「[CREATE INDEX](https://www.postgresql.org/docs/current/sql-createindex.html)」を参照してください。

**インデックスの表示**  
`\d table_name` または同様のコマンドを使用する場合、すべてのインデックスがルーターに表示されるわけではありません。代わりに、次の例に示すように、`pg_catalog.pg_indexes` ビューを使用してインデックスを取得します。  

```
SET rds_aurora.limitless_create_table_mode='sharded';
SET rds_aurora.limitless_create_table_shard_key='{"id"}';
CREATE TABLE items (id int PRIMARY KEY, val int);
CREATE INDEX items_my_index on items (id, val);

postgres_limitless=> SELECT * FROM pg_catalog.pg_indexes WHERE tablename='items';

 schemaname | tablename |   indexname    | tablespace |                                indexdef
------------+-----------+----------------+------------+------------------------------------------------------------------------
 public     | items     | items_my_index |            | CREATE INDEX items_my_index ON ONLY public.items USING btree (id, val)
 public     | items     | items_pkey     |            | CREATE UNIQUE INDEX items_pkey ON ONLY public.items USING btree (id)
(2 rows)
```

## CREATE SCHEMA
<a name="limitless-reference.DDL-limitations.CREATE_SCHEMA"></a>

スキーマ要素を持つ `CREATE SCHEMA` はサポートされていません。

```
CREATE SCHEMA my_schema CREATE TABLE (column_name INT);
```

これにより、次のようなエラーが生成されます。

```
ERROR: CREATE SCHEMA with schema elements is not supported
```

## CREATE TABLE
<a name="limitless-reference.DDL-limitations.CREATE_TABLE"></a>

`CREATE TABLE` ステートメントの関係はサポートされていません。次に例を示します。

```
CREATE TABLE orders (orderid int, customerId int, orderDate date) WITH (autovacuum_enabled = false);
```

`IDENTITY` 列はサポートされていません。次に例を示します。

```
CREATE TABLE orders (orderid INT GENERATED ALWAYS AS IDENTITY);
```

Aurora PostgreSQL Limitless Database は、シャードテーブル名に対して最大 54 文字をサポートします。

## CREATE TABLE AS
<a name="limitless-reference.DDL-limitations.CREATE_TABLE_AS"></a>

`CREATE TABLE AS` を使用してテーブルを作成するには、`rds_aurora.limitless_create_table_mode` 変数を使用する必要があります。シャードテーブルの場合は、`rds_aurora.limitless_create_table_shard_key` 変数も使用する必要があります。詳細については、「[変数を使用した無制限テーブルの作成](limitless-creating-config.md)」を参照してください。

```
-- Set the variables.
SET rds_aurora.limitless_create_table_mode='sharded';
SET rds_aurora.limitless_create_table_shard_key='{"a"}';

CREATE TABLE ctas_table AS SELECT 1 a;

-- "source" is the source table whose columns and data types are used to create the new "ctas_table2" table.
CREATE TABLE ctas_table2 AS SELECT a,b FROM source;
```

リファレンステーブルはプライマリキーの制約を必要とするため、`CREATE TABLE AS` を使用してリファレンステーブルを作成することはできません。`CREATE TABLE AS` はプライマリキーを新しいテーブルに伝播しません。

詳細については、PostgreSQL ドキュメントの「[CREATE TABLE AS](https://www.postgresql.org/docs/current/sql-createtableas.html)」を参照してください。

## DROP DATABASE
<a name="limitless-reference.DDL-limitations.DROP_DATABASE"></a>

作成したデータベースを削除できます。

`DROP DATABASE` コマンドはバックグラウンドで非同期的に実行されます。実行中に、同じ名前で新しいデータベースを作成しようとすると、エラーが発生します。

## SELECT INTO
<a name="limitless-reference.DDL-limitations.SELECT_INTO"></a>

`SELECT INTO` は機能的に [CREATE TABLE AS](#limitless-reference.DDL-limitations.CREATE_TABLE_AS) と似ています。`rds_aurora.limitless_create_table_mode` 変数を使用する必要があります シャードテーブルの場合は、`rds_aurora.limitless_create_table_shard_key` 変数も使用する必要があります。詳細については、「[変数を使用した無制限テーブルの作成](limitless-creating-config.md)」を参照してください。

```
-- Set the variables.
SET rds_aurora.limitless_create_table_mode='sharded';
SET rds_aurora.limitless_create_table_shard_key='{"a"}';

-- "source" is the source table whose columns and data types are used to create the new "destination" table.
SELECT * INTO destination FROM source;
```

現在、`SELECT INTO` オペレーションはシャードから直接ではなく、ルーターを介して実行されます。そのため、パフォーマンスが低下する可能性があります。

詳細については、PostgreSQL ドキュメントの「[SELECT INTO](https://www.postgresql.org/docs/current/sql-selectinto.html)」セクションを参照してください。

## 制約
<a name="limitless-reference.DDL-limitations.Constraints"></a>

Aurora PostgreSQL Limitless Database の制約には、次の制限が適用されます。

**CHECK**  
リテラルとの比較演算子を含むシンプルな制約はサポートされています。次の例に示すように、関数の検証を必要とするより複雑な式や制約はサポートされていません。  

```
CREATE TABLE my_table (
    id  INT CHECK (id > 0)                                     -- supported
  , val INT CHECK (val > 0 AND val < 1000)                     -- supported
  , tag TEXT CHECK (length(tag) > 0)                           -- not supported: throws "Expression inside CHECK constraint is not supported"
  , op_date TIMESTAMP WITH TIME ZONE CHECK (op_date <= now())  -- not supported: throws "Expression inside CHECK constraint is not supported"
);
```
次の例に示すように、制約に明示的な名前を付けることができます。  

```
CREATE TABLE my_table (
    id  INT CONSTRAINT positive_id  CHECK (id > 0)
  , val INT CONSTRAINT val_in_range CHECK (val > 0 AND val < 1000)
);
```
次の例に示すように、`CHECK` 制約でテーブルレベルの制約構文を使用できます。  

```
CREATE TABLE my_table (
    id INT CONSTRAINT positive_id  CHECK (id > 0)
  , min_val INT CONSTRAINT min_val_in_range CHECK (min_val > 0 AND min_val < 1000)
  , max_val INT
  , CONSTRAINT max_val_in_range CHECK (max_val > 0 AND max_val < 1000 AND max_val > min_val)
);
```

**EXCLUDE**  
除外制約は、Aurora PostgreSQL Limitless Database ではサポートされていません。

**外部キー**  
詳細については、「[外部キー](#limitless-reference.DDL-limitations.FKs)」を参照してください。

**NOT NULL**  
`NOT NULL` 制約は制限なしでサポートされています。

**PRIMARY KEY**  
プライマリキーは一意制約を意味するため、一意制約と同じ制限がプライマリキーに適用されます。つまり、次のようになります。  
+ テーブルがシャードテーブルに変換される場合、シャードキーはプライマリキーのサブセットである必要があります。つまり、プライマリキーにはシャードキーのすべての列が含まれます。
+ テーブルがリファレンステーブルに変換される場合は、プライマリキーが必要です。
次の例は、プライマリキーの使用を示しています。  

```
-- Create a standard table.
CREATE TABLE public.my_table (
    item_id INT
  , location_code INT
  , val INT
  , comment text
);

-- Change the table to a sharded table using the 'item_id' and 'location_code' columns as shard keys.
CALL rds_aurora.limitless_alter_table_type_sharded('public.my_table', ARRAY['item_id', 'location_code']);
```
シャードキーを含まないプライマリキーを追加しようとしています。  

```
-- Add column 'item_id' as the primary key.
-- Invalid because the primary key doesnt include all columns from the shard key:
-- 'location_code' is part of the shard key but not part of the primary key
ALTER TABLE public.my_table ADD PRIMARY KEY (item_id); -- ERROR

-- add column "val" as primary key
-- Invalid because primary key does not include all columns from shard key:
--  item_id and location_code iare part of shard key but not part of the primary key
ALTER TABLE public.my_table ADD PRIMARY KEY (item_id); -- ERROR
```
シャードキーを含むプライマリキーを追加しようとしています。  

```
-- Add the 'item_id' and 'location_code' columns as the primary key.
-- Valid because the primary key contains the shard key.
ALTER TABLE public.my_table ADD PRIMARY KEY (item_id, location_code); -- OK

-- Add the 'item_id', 'location_code', and 'val' columns as the primary key.
-- Valid because the primary key contains the shard key.
ALTER TABLE public.my_table ADD PRIMARY KEY (item_id, location_code, val); -- OK
```
標準テーブルをリファレンステーブルに変更します。  

```
-- Create a standard table.
CREATE TABLE zipcodes (zipcode INT PRIMARY KEY, details VARCHAR);

-- Convert the table to a reference table.
CALL rds_aurora.limitless_alter_table_type_reference('public.zipcode');
```
シャードテーブルとリファレンステーブルの作成の詳細については、「[Aurora PostgreSQL Limitless Database テーブルの作成](limitless-creating.md)」を参照してください。

**UNIQUE**  
シャードテーブルでは、一意のキーにシャードキーが含まれている必要があります。つまり、シャードキーは一意のキーのサブセットである必要があります。これは、テーブルタイプをシャードに変更するときにチェックされます。リファレンステーブルには制限はありません。  

```
CREATE TABLE customer (
    customer_id INT NOT NULL
  , zipcode INT
  , email TEXT UNIQUE
);
```
次の例に示すように、テーブルレベルの `UNIQUE` 制約がサポートされています。  

```
CREATE TABLE customer (
    customer_id INT NOT NULL
  , zipcode INT
  , email TEXT
  , CONSTRAINT zipcode_and_email UNIQUE (zipcode, email)
);
```
次の例は、プライマリキーと一意のキーの併用を示しています。両方のキーにシャードキーが含まれている必要があります。  

```
SET rds_aurora.limitless_create_table_mode='sharded';
SET rds_aurora.limitless_create_table_shard_key='{"p_id"}';
CREATE TABLE t1 (
p_id BIGINT NOT NULL,
c_id BIGINT NOT NULL,
PRIMARY KEY (p_id),
UNIQUE (p_id, c_id)
);
```

詳細については、PostgreSQL ドキュメントの「[Constraints](https://www.postgresql.org/docs/current/ddl-constraints.html)」を参照してください。

## デフォルト値
<a name="limitless-reference.DDL-limitations.DefaultValues"></a>

Aurora PostgreSQL Limitless Database は、デフォルト値の式をサポートしています。

次の例は、デフォルト値の使用を示しています。

```
CREATE TABLE t (
    a INT DEFAULT 5,
    b TEXT DEFAULT 'NAN',
    c NUMERIC
);

CALL rds_aurora.limitless_alter_table_type_sharded('t', ARRAY['a']);
INSERT INTO t DEFAULT VALUES;
SELECT * FROM t;

 a |  b  | c 
---+-----+---
 5 | NAN |
(1 row)
```

次の例に示すように、式がサポートされています。

```
CREATE TABLE t1 (a NUMERIC DEFAULT random());
```

次の例では、`NOT NULL` で、デフォルト値を持つ新しい列を追加します。

```
ALTER TABLE t ADD COLUMN d BOOLEAN NOT NULL DEFAULT FALSE;
SELECT * FROM t;

 a |  b  | c | d 
---+-----+---+---
 5 | NAN |   | f
(1 row)
```

次の例では、デフォルト値で既存の列を変更します。

```
ALTER TABLE t ALTER COLUMN c SET DEFAULT 0.0;
INSERT INTO t DEFAULT VALUES;
SELECT * FROM t;

 a |  b  | c   |  d  
---+-----+-----+-----
 5 | NAN |     | f
 5 | NAN | 0.0 | f
(2 rows)
```

次の例では、デフォルト値を削除します。

```
ALTER TABLE t ALTER COLUMN a DROP DEFAULT;
INSERT INTO t DEFAULT VALUES;
SELECT * FROM t;

 a |  b  | c   |  d  
---+-----+-----+-----
 5 | NAN |     | f
 5 | NAN | 0.0 | f
   | NAN | 0.0 | f
(3 rows)
```

詳細については、PostgreSQL ドキュメントの「[Default values](https://www.postgresql.org/docs/current/ddl-default.html)」を参照してください。

## 拡張子
<a name="limitless-reference.DDL-limitations.Extensions"></a>

Aurora PostgreSQL Limitless Database では、次の PostgreSQL 拡張機能がサポートされています。
+ `aurora_limitless_fdw` – この拡張機能はプリインストールされています。削除することはできません。
+ `aws_s3` – この拡張機能は、Aurora PostgreSQL と同様に Aurora PostgreSQL Limitless Database で動作します。

  Amazon S3 バケットから Aurora PostgreSQL Limitless Database DB クラスターにデータをインポートするか、Aurora PostgreSQL Limitless Database DB クラスターから Amazon S3 バケットにデータをエクスポートします。詳細については、「[Amazon S3 から Aurora PostgreSQL DB クラスター にデータをインポートする](USER_PostgreSQL.S3Import.md)」および「[Aurora PostgreSQL DB クラスターから Amazon S3 へのデータのエクスポート](postgresql-s3-export.md)」を参照してください。
+ `btree_gin`
+ `citext`
+ `ip4r`
+ `pg_buffercache` – この拡張機能は、Aurora PostgreSQL Limitless Database とコミュニティ PostgreSQL では動作が異なります。詳細については、「[Aurora PostgreSQL Limitless Database での pg\$1buffercache の違い](#limitless-reference.DDL-limitations.Extensions.pg_buffercache)」を参照してください。
+ `pg_stat_statements`
+ `pg_trgm`
+ `pgcrypto`
+ `pgstattuple` – この拡張機能は、Aurora PostgreSQL Limitless Database とコミュニティ PostgreSQL では動作が異なります。詳細については、「[Aurora PostgreSQL Limitless Database での pgstattuple の違い](#limitless-reference.DDL-limitations.Extensions.pgstattuple)」を参照してください。
+ `pgvector`
+ `plpgsql` – この拡張機能はプリインストールされていますが、削除できます。
+ `PostGIS` – 長いトランザクションとテーブル管理機能はサポートされていません。空間リファレンステーブルの変更はサポートされていません。
+ `unaccent`
+ `uuid`

現在、ほとんどの PostgreSQL 拡張機能は Aurora PostgreSQL Limitless Database ではサポートされていません。ただし、[shared\$1preload\$1libraries](https://www.postgresql.org/docs/current/runtime-config-client.html#RUNTIME-CONFIG-CLIENT-PRELOAD) (SPL) 設定を使用して、拡張機能を Aurora PostgreSQL プライマリ DB クラスターにロードすることはできます。また、Aurora PostgreSQL Limitless Database にもロードされますが、正しく機能しない場合があります。

例えば、`pg_hint_plan` 拡張機能をロードすることはできますが、ロードしても、クエリコメントで渡されたヒントが使用されるとは限りません。

**注記**  
[pg\$1stat\$1statements](https://www.postgresql.org/docs/current/pgstatstatements.html) 拡張機能に関連付けられたオブジェクトを変更することはできません。`pg_stat_statements` のインストールの詳細については、「[limitless\$1stat\$1statements](limitless-monitoring-views.md#limitless_stat_statements)」を参照してください。

`pg_available_extensions` および `pg_available_extension_versions` 関数を使用して、Aurora PostgreSQL Limitless Database でサポートされている拡張機能を検索できます。

以下の DDL は拡張機能に対してサポートされています｡

**CREATE EXTENSION**  
PostgreSQL と同様に、拡張機能を作成できます。  

```
CREATE EXTENSION [ IF NOT EXISTS ] extension_name
    [ WITH ] [ SCHEMA schema_name ]
             [ VERSION version ]
             [ CASCADE ]
```
詳細については、PostgreSQL ドキュメントの「[CREATE EXTENSION](https://www.postgresql.org/docs/current/sql-createextension.html)」を参照してください。

**ALTER EXTENSION**  
次の DDL がサポートされています。  

```
ALTER EXTENSION name UPDATE [ TO new_version ]

ALTER EXTENSION name SET SCHEMA new_schema
```
詳細については、PostgreSQL ドキュメントの「[ALTER EXTENSION](https://www.postgresql.org/docs/current/sql-alterextension.html)」を参照してください。

**DROP EXTENSION**  
PostgreSQL と同様に、拡張機能を削除できます。  

```
DROP EXTENSION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
```
詳細については、PostgreSQL ドキュメントの「[DROP EXTENSION](https://www.postgresql.org/docs/current/sql-dropextension.html)」を参照してください。

以下の DDL は拡張機能に対してサポートされません｡

**ALTER EXTENSION**  
拡張機能からメンバーオブジェクトを追加または削除することはできません。  

```
ALTER EXTENSION name ADD member_object

ALTER EXTENSION name DROP member_object
```

### Aurora PostgreSQL Limitless Database での pg\$1buffercache の違い
<a name="limitless-reference.DDL-limitations.Extensions.pg_buffercache"></a>

Aurora PostgreSQL Limitless Database では、[pg\$1buffercache](https://www.postgresql.org/docs/current/pgbuffercache.html) 拡張機能をインストールして `pg_buffercache` ビューを使用すると、現在接続されているノード、つまりルーターからのみバッファ関連の情報を受信します。同様に、関数 `pg_buffercache_summary` または `pg_buffercache_usage_counts` を使用すると、接続されたノードからの情報のみが提供されます。

多数のノードがあり、問題を効果的に診断するために任意のノードからバッファ情報にアクセスする必要がある場合があります。そのため、Limitless Database には次の関数が用意されています。
+ `rds_aurora.limitless_pg_buffercache(subcluster_id)`
+ `rds_aurora.limitless_pg_buffercache_summary(subcluster_id)`
+ `rds_aurora.limitless_pg_buffercache_usage_counts(subcluster_id)`

任意のノードのサブクラスター ID を入力することで、ルーターでもシャードでも、そのノードに固有のバッファ情報に簡単にアクセスできます。これらの関数は、制限なしのデータベースに `pg_buffercache` 拡張機能をインストールするときに直接使用できます。

**注記**  
Aurora PostgreSQL Limitless Database では、`pg_buffercache` 拡張機能のバージョン 1.4 以降でこれらの関数がサポートされます。

`limitless_pg_buffercache` ビューに表示される列は、`pg_buffercache` ビューの列とは若干異なります。
+ `bufferid` - `pg_buffercache` から変更されません。
+ `relname` – ファイルノード番号を `pg_buffercache` のように表示する代わりに、`limitless_pg_buffercache` は現在のデータベースまたは共有システムカタログで使用可能な場合は関連付けられた `relname` を表示し、それ以外の場合は `NULL` を表示します。
+ `parent_relname` – `pg_buffercache` に存在しないこの新しい列には、`relname` 列の値がパーティションテーブルを表す場合 (シャードテーブルの場合)、親 `relname` が表示されます。それ以外の場合は、`NULL` が表示されます。
+ `spcname` – テーブルスペースオブジェクト識別子 (OID) を `pg_buffercache` のように表示する代わりに、`limitless_pg_buffercache` はテーブルスペース名を表示します。
+ `datname` – データベース OID を `pg_buffercache` のように表示する代わりに、`limitless_pg_buffercache` はデータベース名を表示します。
+ `relforknumber` - `pg_buffercache` から変更されません。
+ `relblocknumber` - `pg_buffercache` から変更されません。
+ `isdirty` - `pg_buffercache` から変更されません。
+ `usagecount` - `pg_buffercache` から変更されません。
+ `pinning_backends` - `pg_buffercache` から変更されません。

`limitless_pg_buffercache_summary` ビューと `limitless_pg_buffercache_usage_counts` ビューの列は、それぞれ通常の `pg_buffercache_summary` ビューと `pg_buffercache_usage_counts` ビューの列と同じです。

これらの関数を使用すると、Limitless Database 環境内のすべてのノードの詳細なバッファキャッシュ情報にアクセスでき、データベースシステムの診断と管理をより効果的に行えます。

### Aurora PostgreSQL Limitless Database での pgstattuple の違い
<a name="limitless-reference.DDL-limitations.Extensions.pgstattuple"></a>

Aurora PostgreSQL では、[pgstattuple](https://www.postgresql.org/docs/current/pgstattuple.html) 拡張機能は現在、外部テーブル、パーティションテーブル、またはパーティションインデックスをサポートしていません。ただし、Aurora PostgreSQL Limitless Database では、ユーザーが作成したオブジェクトがこれらのサポートされていないタイプであることがよくあります。通常のテーブルとインデックス (カタログテーブルとそのインデックスなど) がありますが、ほとんどのオブジェクトは外部ノードに存在し、ルーターの外部オブジェクトになります。

AWS では、タプルレベルの統計を取得するためのこの拡張機能の重要性を認識しています。こうした統計は、肥大化の排除や診断情報の収集などのタスクに不可欠です。そのため、Aurora PostgreSQL Limitless Database は、制限のないデータベースで `pgstattuple` 拡張機能をサポートします。

Aurora PostgreSQL Limitless Database には、`rds_aurora` スキーマに次の関数が含まれています。

**タプルレベルの統計関数**  
**`rds_aurora.limitless_pgstattuple(relation_name)`**  
+ 目的: 標準テーブルとそのインデックスのタプルレベルの統計を抽出する
+ 入力: `relation_name` (テキスト) - リレーションの名前
+ 出力: Aurora PostgreSQL の `pgstattuple` 関数によって返される列と一致する列
**`rds_aurora.limitless_pgstattuple(relation_name, subcluster_id)`**  
+ 目的: リファレンステーブル、シャードテーブル、カタログテーブル、およびインデックスのタプルレベルの統計を抽出する
+ 入力
  + `relation_name` (テキスト) - リレーションの名前
  + `subcluster_id` (テキスト) – 統計を抽出するノードのサブクラスター ID
+ 出力:
  + リファレンステーブルとカタログテーブル (インデックスを含む) の場合、列は Aurora PostgreSQL の列と一致します。
  + シャードテーブルの場合、統計は、指定されたサブクラスターに存在するシャードテーブルのパーティションのみを表します。

**インデックス統計関数**  
**`rds_aurora.limitless_pgstatindex(relation_name)`**  
+ 目的: 標準テーブルの B ツリーインデックスの統計を抽出する
+ 入力: `relation_name` (テキスト) - B ツリーインデックスの名前
+ 出力: `root_block_no` を除くすべての列が返されます。返される列は、Aurora PostgreSQL の `pgstatindex` 関数と一致します。
**`rds_aurora.limitless_pgstatindex(relation_name, subcluster_id)`**  
+ 目的: リファレンステーブル、シャードテーブル、カタログテーブルの B ツリーインデックスの統計を抽出する。
+ 入力
  + `relation_name` (テキスト) – B ツリーインデックスの名前
  + `subcluster_id` (テキスト) – 統計を抽出するノードのサブクラスター ID
+ 出力:
  + リファレンステーブルとカタログテーブルインデックスの場合、すべての列 (`root_block_no` を除く) が返されます。返される列は Aurora PostgreSQL と一致します。
  + シャードテーブルの場合、統計は、指定されたサブクラスターに存在するシャードテーブルインデックスのパーティションのみを表します。`tree_level` 列には、リクエストされたサブクラスターのすべてのテーブルスライスの平均が表示されます。
**`rds_aurora.limitless_pgstatginindex(relation_name)`**  
+ 目的: 標準テーブルの一般化逆インデックス (GIN) の統計を抽出する
+ 入力: `relation_name` (テキスト) – GIN の名前
+ 出力: Aurora PostgreSQL の `pgstatginindex` 関数によって返される列と一致する列
**`rds_aurora.limitless_pgstatginindex(relation_name, subcluster_id)`**  
+ 目的: リファレンステーブル、シャードテーブル、カタログテーブルの GIN インデックスの統計を抽出する。
+ 入力
  + `relation_name` (テキスト) – インデックスの名前
  + `subcluster_id` (テキスト) – 統計を抽出するノードのサブクラスター ID
+ 出力:
  + リファレンステーブルとカタログテーブルの GIN インデックスの場合、列は Aurora PostgreSQL の列と一致します。
  + シャードテーブルの場合、統計は、指定されたサブクラスターに存在するシャードテーブルインデックスのパーティションのみを表します。
**`rds_aurora.limitless_pgstathashindex(relation_name)`**  
+ 目的: 標準テーブルのハッシュインデックスの統計を抽出する
+ 入力: `relation_name` (テキスト) – ハッシュインデックスの名前
+ 出力: Aurora PostgreSQL の `pgstathashindex` 関数によって返される列と一致する列
**`rds_aurora.limitless_pgstathashindex(relation_name, subcluster_id)`**  
+ 目的: リファレンステーブル、シャードテーブル、カタログテーブルのハッシュインデックスの統計を抽出する。
+ 入力
  + `relation_name` (テキスト) – インデックスの名前
  + `subcluster_id` (テキスト) – 統計を抽出するノードのサブクラスター ID
+ 出力:
  + リファレンステーブルととカタログテーブルのハッシュインデックスの場合、列は Aurora PostgreSQL の列と一致します。
  + シャードテーブルの場合、統計は、指定されたサブクラスターに存在するシャードテーブルインデックスのパーティションのみを表します。

**ページ数関数**  
**`rds_aurora.limitless_pg_relpages(relation_name)`**  
+ 目的: 標準テーブルとそのインデックスのページ数を抽出する
+ 入力: `relation_name` (テキスト) - リレーションの名前
+ 出力: 指定されたリレーションのページ数
**`rds_aurora.limitless_pg_relpages(relation_name, subcluster_id)`**  
+ 目的: リファレンステーブル、シャードテーブル、カタログテーブル (そのインデックスを含む) のページ数を抽出する
+ 入力
  + `relation_name` (テキスト) - リレーションの名前
  + `subcluster_id` (テキスト) – ページ数が抽出されるノードのサブクラスター ID
+ 出力: シャードテーブルの場合、ページ数は、指定されたサブクラスターのすべてのテーブルスライスのページ数の合計です。

**概算のタプルレベルの統計関数**  
**`rds_aurora.limitless_pgstattuple_approx(relation_name)`**  
+ 目的: 標準テーブルとそのインデックスの概算のタプルレベルの統計を抽出する
+ 入力: `relation_name` (テキスト) - リレーションの名前
+ 出力: Aurora PostgreSQL の pgstattuple\$1approx 関数によって返される列と一致する列
**`rds_aurora.limitless_pgstattuple_approx(relation_name, subcluster_id)`**  
+ 目的: リファレンステーブル、シャードテーブル、カタログテーブル (そのインデックスを含む) の概算のタプルレベルの統計を抽出する
+ 入力
  + `relation_name` (テキスト) - リレーションの名前
  + `subcluster_id` (テキスト) – 統計を抽出するノードのサブクラスター ID
+ 出力:
  + リファレンステーブルとカタログテーブル (インデックスを含む) の場合、列は Aurora PostgreSQL の列と一致します。
  + シャードテーブルの場合、統計は、指定されたサブクラスターに存在するシャードテーブルのパーティションのみを表します。

**注記**  
現在、Aurora PostgreSQL Limitless Database は、マテリアライズドビュー、TOAST テーブル、または一時テーブルの `pgstattuple` 拡張機能をサポートしていません。  
Aurora PostgreSQL Limitless Database では、入力をテキストとして指定する必要がありますが、Aurora PostgreSQL は他の形式もサポートしています。

## 外部キー
<a name="limitless-reference.DDL-limitations.FKs"></a>

外部キー (`FOREIGN KEY`) の制約は、いくつかの制限付きでサポートされています。
+ `FOREIGN KEY` を使った `CREATE TABLE` は、標準テーブルでのみサポートされています。`FOREIGN KEY` を使ってシャードテーブルまたはリファレンステーブルを作成するには、まず外部キーの制約なしでテーブルを作成します。次に、次のステートメントを使用して変更します。

  ```
  ALTER TABLE ADD CONSTRAINT;
  ```
+ テーブルに外部キー制約がある場合、標準テーブルをシャードテーブルまたはリファレンステーブルに変換することはサポートされていません。制約を削除し、変換後に追加します。
+ 外部キー制約のテーブルタイプには、次の制限が適用されます。
  + 標準テーブルには、別の標準テーブルへの外部キー制約を含めることができます。
  + 親テーブルと子テーブルがコロケーションされ、外部キーがシャードキーのスーパーセットである場合、シャードテーブルには外部キー制約を含めることができます。
  + シャードテーブルには、リファレンステーブルへの外部キー制約を含めることができます。
  + リファレンステーブルには、別のリファレンステーブルへの外部キー制約を含めることができます。

**Topics**
+ [外部キーオプション](#limitless-reference.DDL-limitations.FKs.options)
+ [例](#limitless-reference.DDL-limitations.FKs.examples)

### 外部キーオプション
<a name="limitless-reference.DDL-limitations.FKs.options"></a>

Aurora PostgreSQL Limitless Database では、一部の DDL オプションで外部キーがサポートされています。次の表では、Aurora PostgreSQL Limitless Database テーブル間でサポートされるオプションと、サポートされないオプションを示しています。


| DDL オプション | リファレンスからリファレンス | シャードからシャード (コロケーション） | シャードからリファレンス | 標準から標準 | 
| --- | --- | --- | --- | --- | 
|  `DEFERRABLE`  | はい  | あり | あり | あり | 
|  `INITIALLY DEFERRED`  | あり | あり | あり | あり | 
|  `INITIALLY IMMEDIATE`  | あり | あり | あり | あり | 
|  `MATCH FULL`  | あり | あり | あり | はい | 
|  `MATCH PARTIAL`  | いいえ | いいえ | いいえ | いいえ | 
|  `MATCH SIMPLE`  | はい | あり | あり | あり | 
|  `NOT DEFERRABLE`  | あり | あり | あり | あり | 
|  `NOT VALID`  | はい | いいえ | いいえ | はい | 
|  `ON DELETE CASCADE`  | あり | あり | あり | あり | 
|  `ON DELETE NO ACTION`  | あり | あり | あり | あり | 
|  `ON DELETE RESTRICT`  | あり | あり | あり | はい | 
|  `ON DELETE SET DEFAULT`  | いいえ | いいえ | いいえ | いいえ | 
|  `ON DELETE SET NULL`  | あり | いいえ | いいえ | あり | 
|  `ON UPDATE CASCADE`  | いいえ | いいえ | いいえ | はい | 
|  `ON UPDATE NO ACTION`  | あり | あり | あり | あり | 
|  `ON UPDATE RESTRICT`  | あり | あり | あり | はい | 
|  `ON UPDATE SET DEFAULT`  | いいえ | いいえ | いいえ | いいえ | 
|  `ON UPDATE SET NULL`  | あり | いいえ | いいえ | はい | 

### 例
<a name="limitless-reference.DDL-limitations.FKs.examples"></a>
+ 標準から標準:

  ```
  set rds_aurora.limitless_create_table_mode='standard';
  
  CREATE TABLE products(
      product_no integer PRIMARY KEY,
      name text,
      price numeric
  );
  
  CREATE TABLE orders (
      order_id integer PRIMARY KEY,
      product_no integer REFERENCES products (product_no),
      quantity integer
  );
  
  SELECT constraint_name, table_name, constraint_type 
  FROM information_schema.table_constraints WHERE constraint_type='FOREIGN KEY';
  
   constraint_name         | table_name  | constraint_type 
  -------------------------+-------------+-----------------
   orders_product_no_fkey  | orders      | FOREIGN KEY
  (1 row)
  ```
+ シャードからシャード (コロケーション):

  ```
  set rds_aurora.limitless_create_table_mode='sharded';
  set rds_aurora.limitless_create_table_shard_key='{"product_no"}'; 
  CREATE TABLE products(
      product_no integer PRIMARY KEY,
      name text,
      price numeric
  );
  
  set rds_aurora.limitless_create_table_shard_key='{"order_id"}'; 
  set rds_aurora.limitless_create_table_collocate_with='products';
  CREATE TABLE orders (
      order_id integer PRIMARY KEY,
      product_no integer,
      quantity integer
  );
  
  ALTER TABLE orders ADD CONSTRAINT order_product_fk FOREIGN KEY (product_no) REFERENCES products (product_no);
  ```
+ シャードからリファレンス:

  ```
  set rds_aurora.limitless_create_table_mode='reference';
  CREATE TABLE products(
      product_no integer PRIMARY KEY,
      name text,
      price numeric
  );
  
  set rds_aurora.limitless_create_table_mode='sharded';
  set rds_aurora.limitless_create_table_shard_key='{"order_id"}'; 
  CREATE TABLE orders (
      order_id integer PRIMARY KEY,
      product_no integer,
      quantity integer
  );
  
  ALTER TABLE orders ADD CONSTRAINT order_product_fk FOREIGN KEY (product_no) REFERENCES products (product_no);
  ```
+ リファレンスからリファレンス:

  ```
  set rds_aurora.limitless_create_table_mode='reference';
  CREATE TABLE products(
      product_no integer PRIMARY KEY,
      name text,
      price numeric
  );
  CREATE TABLE orders (
      order_id integer PRIMARY KEY,
      product_no integer,
      quantity integer
  );
  
  ALTER TABLE orders ADD CONSTRAINT order_product_fk FOREIGN KEY (product_no) REFERENCES products (product_no);
  ```

## 関数
<a name="limitless-reference.DDL-limitations.Functions"></a>

関数は、Aurora PostgreSQL Limitless Database でサポートされています。

次の DDL は関数に対してサポートされています。

**CREATE FUNCTION**  
Aurora PostgreSQL と同様に関数を作成できますが、関数を置き換える際の可変性の変更は除きます。  
詳細については、PostgreSQL のドキュメントの「[機能の作成](https://www.postgresql.org/docs/current/sql-createfunction.html)」を参照してください。

**ALTER FUNCTION**  
Aurora PostgreSQL と同様に関数を変更できますが、可変性の変更は除きます。  
詳細については、PostgreSQL ドキュメントの「[ALTER FUNCTION](https://www.postgresql.org/docs/current/sql-alterfunction.html)」を参照してください。

**DROP FUNCTION**  
Aurora PostgreSQL と同様に関数を削除できます。  

```
DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
    [ CASCADE | RESTRICT ]
```
詳細については、PostgreSQL ドキュメントの「[DROP FUNCTION](https://www.postgresql.org/docs/current/sql-dropfunction.html)」を参照してください。

**Topics**
+ [関数の分散](#limitless-function-distribution)
+ [関数の可変性](#limitless-function-volatility)

### 関数の分散
<a name="limitless-function-distribution"></a>

関数のすべてのステートメントが 1 つのシャードを対象とする場合、関数全体をターゲットシャードにプッシュダウンすると有益です。その場合、ルーター自体で関数を解決するのではなく、結果はルーターに伝播されます。関数とストアドプロシージャのプッシュダウン機能は、シャードであるデータソースの近くで関数またはストアドプロシージャを実行したい場合に便利です。

関数を分散させるには、まず関数を作成してから、関数を分散するための `rds_aurora.limitless_distribute_function` プロシージャを呼び出します。この関数では次の構文を使用します。

```
SELECT rds_aurora.limitless_distribute_function('function_prototype', ARRAY['shard_key'], 'collocating_table');
```

関数では以下のパラメータを使用します。
+ `function_prototype` – 分散する関数。入力引数のみを含め、出力引数は含めないでください。

  いずれかの引数が `OUT` パラメータとして定義されている場合は、`function_prototype` の引数にその型を含めないでください。
+ `ARRAY['shard_key']` – 関数のシャードキーとして識別される関数引数のリスト。
+ `collocating_table` – ターゲットシャードのデータ範囲を含むシャードテーブル。

この関数を実行するためにどのシャードにプッシュダウンするかを識別するため、システムは `ARRAY['shard_key']` 引数を取得し、これをハッシュ化して、このハッシュ値を含む範囲をホストする `collocating_table` からシャードを特定します。

**制限事項**  
関数またはプロシージャを分散させる場合、関数またはプロシージャはそのシャード内のシャードキー範囲によって制限されるデータのみを扱います。関数またはプロシージャが別のシャードからデータにアクセスしようとする場合、分散関数または分散プロシージャによって返される結果は、分散されていない場合とは異なります。  
例えば、複数のシャードにアクセスするクエリを含む関数を作成し、`rds_aurora.limitless_distribute_function` プロシージャを呼び出して分散させる場合です。シャードキーの引数を指定してこの関数を呼び出すと、実行の結果がそのシャードに存在する値によって制限される可能性があります。これらの結果は、関数を分散させずに生成された結果とは異なります。

**例**  
 シャードキー `customer_id` を持つシャードテーブル `customers` がある場合の次の関数 `func` について考えてみます。  

```
postgres_limitless=> CREATE OR REPLACE FUNCTION func(c_id integer, sc integer) RETURNS int
    language SQL
    volatile
    AS $$
    UPDATE customers SET score = sc WHERE customer_id = c_id RETURNING score;
    $$;
```
次に、この関数を分散させます。  

```
SELECT rds_aurora.limitless_distribute_function('func(integer, integer)', ARRAY['c_id'], 'customers');
```
以下はクエリプランの例です。  

```
EXPLAIN(costs false, verbose true) SELECT func(27+1,10);

                    QUERY PLAN
 --------------------------------------------------
  Foreign Scan
    Output: (func((27 + 1), 10))
    Remote SQL:  SELECT func((27 + 1), 10) AS func
  Single Shard Optimized
 (4 rows)
```

```
EXPLAIN(costs false, verbose true)
 SELECT * FROM customers,func(customer_id, score) WHERE customer_id=10 AND score=27;

                          QUERY PLAN
 ---------------------------------------------------------------------
  Foreign Scan
    Output: customer_id, name, score, func
    Remote SQL:  SELECT customers.customer_id,
      customers.name,
      customers.score,
      func.func
     FROM public.customers,
      LATERAL func(customers.customer_id, customers.score) func(func)
    WHERE ((customers.customer_id = 10) AND (customers.score = 27))
  Single Shard Optimized
 (10 rows)
```
次の例は、`IN` と `OUT` パラメータを引数に持つプロシージャを示しています。  

```
CREATE OR REPLACE FUNCTION get_data(OUT id INTEGER, IN arg_id INT)
    AS $$
    BEGIN
        SELECT customer_id,
        INTO id
        FROM customer
        WHERE customer_id = arg_id;
    END;
    $$ LANGUAGE plpgsql;
```
次の例では、`IN` パラメータのみを使用してプロシージャを分散させます。  

```
EXPLAIN(costs false, verbose true) SELECT * FROM get_data(1);

             QUERY PLAN
 -----------------------------------
  Foreign Scan
    Output: id
    Remote SQL:  SELECT customer_id
     FROM get_data(1) get_data(id)
  Single Shard Optimized
 (6 rows)
```

### 関数の可変性
<a name="limitless-function-volatility"></a>

関数が Immutable、Stable、または Volatile であるかを確認するには、[pg\$1proc](https://www.postgresql.org/docs/current/catalog-pg-proc.html) ビューの `provolatile` 値をチェックすることができます。`provolatile` 値は、関数の結果が入力引数のみに依存するか、外部要因の影響を受けるかを示します。

値は次のいずれかです。
+ `i` – Immutable 関数。同じ入力に対して常に同じ結果を提供します。
+ `s` – Stable 関数。スキャン内で (固定された入力に対する) 結果が変わりません。
+ `v` – Volatile 関数。結果がいつでも変わる可能性があります。また、副作用のある関数で `v` を使用すると、関数への呼び出しが最適化されません。

次の例は、Volatile 関数を示しています。

```
SELECT proname, provolatile FROM pg_proc WHERE proname='pg_sleep';

 proname  | provolatile
----------+-------------
 pg_sleep | v
(1 row)

SELECT proname, provolatile FROM pg_proc WHERE proname='uuid_generate_v4';

     proname      | provolatile
------------------+-------------
 uuid_generate_v4 | v
(1 row)

SELECT proname, provolatile FROM pg_proc WHERE proname='nextval';

 proname | provolatile
---------+-------------
 nextval | v
(1 row)
```

既存の関数のボラティリティの変更は、Aurora PostgreSQL Limitless Database ではサポートされていません。これは、次の例に示すように、`ALTER FUNCTION` コマンドと `CREATE OR REPLACE FUNCTION` コマンドの両方に適用されます。

```
-- Create an immutable function
CREATE FUNCTION immutable_func1(name text) RETURNS text language plpgsql
AS $$
BEGIN
    RETURN name;
END;
$$IMMUTABLE;

-- Altering the volatility throws an error
ALTER FUNCTION immutable_func1 STABLE;

-- Replacing the function with altered volatility throws an error
CREATE OR REPLACE FUNCTION immutable_func1(name text) RETURNS text language plpgsql
AS $$
BEGIN
    RETURN name;
END;
$$VOLATILE;
```

関数に正しいボラティリティーを割り当てることを強くお勧めします。例えば、関数が複数のテーブルから `SELECT` を使用したり、データベースオブジェクトを参照したりする場合は、`IMMUTABLE` として設定しないでください。テーブルの内容が一度でも変更されると、イミュータビリティが壊れます。

Aurora PostgreSQL は Immutable 関数内で `SELECT` を許可しますが、結果が正しくない可能性があります。Aurora PostgreSQL Limitless Database が、エラーと誤った結果の両方を返す可能性があります。詳細については、PostgreSQL ドキュメントの「[Function volatility categories](https://www.postgresql.org/docs/current/xfunc-volatility.html)」を参照してください。

## シーケンス
<a name="limitless-reference.DDL-limitations.Sequences"></a>

名前付きシーケンスは、昇順または降順で一意の番号を生成するデータベースオブジェクトです。`CREATE SEQUENCE` は新しいシーケンス番号ジェネレーターを作成します。シーケンスの値は一意であることが保証されています。

Aurora PostgreSQL Limitless Database で名前付きシーケンスを作成すると、分散シーケンスオブジェクトが作成されます。次に、Aurora PostgreSQL Limitless Database は、シーケンス値の重複しないチャンクをすべての分散トランザクションルーター (ルーター) に分散します。チャンクはルーター上のローカルシーケンスオブジェクトとして表されるため、`nextval` や `currval` などのシーケンスオペレーションはローカルで実行されます。ルーターは独立して動作し、必要に応じて分散シーケンスから新しいチャンクをリクエストします。

シーケンスの詳細については、PostgreSQL ドキュメントの「[CREATE SEQUENCE](https://www.postgresql.org/docs/current/sql-createsequence.html)」を参照してください。

**Topics**
+ [新しいチャンクのリクエスト](#limitless-reference.DDL-limitations.Sequences.request-chunk)
+ [制限](#limitless-reference.DDL-limitations.Sequences.limitations)
+ [サポートされていないオプション](#limitless-reference.DDL-limitations.Sequences.unsupported)
+ [例](#limitless-reference.DDL-limitations.Sequences.examples)
+ [シーケンスビュー](#limitless-reference.DDL-limitations.Sequences.views)
+ [シーケンスの問題のトラブルシューティング](#limitless-reference.DDL-limitations.Sequences.troubleshooting)

### 新しいチャンクのリクエスト
<a name="limitless-reference.DDL-limitations.Sequences.request-chunk"></a>

ルーターに割り当てられたチャンクのサイズを設定するには、`rds_aurora.limitless_sequence_chunk_size` パラメータを使用します。デフォルト値は `250000` です。各ルーターは、最初にアクティブとリザーブドの 2 つのチャンクを所有しています。アクティブチャンクはローカルシーケンスオブジェクトの設定 (`minvalue` および `maxvalue` の設定) に使用され、予約済みチャンクは内部カタログテーブルに保存されます。アクティブチャンクが最小値または最大値に達すると、予約済みチャンクに置き換えられます。そのために、内部で `ALTER SEQUENCE` が使用され、これにより `AccessExclusiveLock` が取得されます。

バックグラウンドワーカーは、ルーターノードで 10 秒ごとに実行され、使用済みの予約済みチャンクのシーケンスをスキャンします。使用済みチャンクが見つかった場合、ワーカーは分散シーケンスから新しいチャンクをリクエストします。バックグラウンドワーカーが新しいチャンクをリクエストするのに十分な時間を確保できるように、チャンクサイズを十分な大きさに設定してください。リモートリクエストはユーザーセッションのコンテキストでは発生しません。つまり、新しいシーケンスを直接リクエストすることはできません。

### 制限
<a name="limitless-reference.DDL-limitations.Sequences.limitations"></a>

Aurora PostgreSQL Limitless Database のシーケンスには、次の制限が適用されます。
+ `pg_sequence` カタログ、`pg_sequences` 関数、および `SELECT * FROM sequence_name` ステートメントはいずれも、ローカルのシーケンス状態のみを表示し、分散状態は表示しません。
+ シーケンス値は一意であることが保証されており、セッション内で単調であることが保証されています。ただし、他のセッションが他のルーターに接続されている場合、他のセッションで `nextval` ステートメントが実行されると順不同になる可能性があります。
+ シーケンスサイズ (使用可能な値の数) が、すべてのルーターに分散するのに十分な大きさであることを確認してください。`rds_aurora.limitless_sequence_chunk_size` パラメータを使用して、`chunk_size` を設定します。(各ルーターには 2 つのチャンクがあります。)
+ `CACHE` オプションはサポートされていますが、キャッシュは `chunk_size` より小さくなければなりません。

### サポートされていないオプション
<a name="limitless-reference.DDL-limitations.Sequences.unsupported"></a>

以下のオプションは、Aurora PostgreSQL Limitless Database のシーケンスではサポートされていません。

**シーケンス操作関数**  
`setval` 関数はサポートされていません。詳細については、PostgreSQL ドキュメントの「[Sequence Manipulation Functions](https://www.postgresql.org/docs/current/functions-sequence.html)」を参照してください。

**CREATE SEQUENCE**  
次のオプションはサポートされていません。  

```
CREATE [{ TEMPORARY | TEMP} | UNLOGGED] SEQUENCE
    [[ NO ] CYCLE]
```
詳細については、PostgreSQL ドキュメントの「[CREATE SEQUENCE](https://www.postgresql.org/docs/current/sql-createsequence.html)」を参照してください。

**ALTER SEQUENCE**  
次のオプションはサポートされていません。  

```
ALTER SEQUENCE
    [[ NO ] CYCLE]
```
詳細については、PostgreSQL ドキュメントの「[ALTER SEQUENCE](https://www.postgresql.org/docs/current/sql-altersequence.html)」を参照してください。

**ALTER TABLE**  
`ALTER TABLE` コマンドはシーケンスではサポートされていません。

### 例
<a name="limitless-reference.DDL-limitations.Sequences.examples"></a>

**CREATE/DROP SEQUENCE**  

```
postgres_limitless=> CREATE SEQUENCE s;
CREATE SEQUENCE

postgres_limitless=> SELECT nextval('s');

 nextval
---------
       1
(1 row)

postgres_limitless=> SELECT * FROM pg_sequence WHERE seqrelid='s'::regclass;

 seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle 
----------+----------+----------+--------------+--------+--------+----------+----------
    16960 |       20 |        1 |            1 |  10000 |      1 |        1 | f
(1 row)

% connect to another router
postgres_limitless=> SELECT nextval('s');

 nextval 
---------
   10001
(1 row)

postgres_limitless=> SELECT * FROM pg_sequence WHERE seqrelid='s'::regclass;

 seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle 
----------+----------+----------+--------------+--------+--------+----------+----------
    16959 |       20 |    10001 |            1 |  20000 |  10001 |        1 | f
(1 row)

postgres_limitless=> DROP SEQUENCE s;
DROP SEQUENCE
```

**ALTER SEQUENCE**  

```
postgres_limitless=> CREATE SEQUENCE s;
CREATE SEQUENCE

postgres_limitless=> ALTER SEQUENCE s RESTART 500;
ALTER SEQUENCE

postgres_limitless=> SELECT nextval('s');

 nextval
---------
     500
(1 row)

postgres_limitless=> SELECT currval('s');

 currval
---------
     500
(1 row)
```

**シーケンス操作関数**  

```
postgres=# CREATE TABLE t(a bigint primary key, b bigint);
CREATE TABLE

postgres=# CREATE SEQUENCE s minvalue 0 START 0;
CREATE SEQUENCE

postgres=# INSERT INTO t VALUES (nextval('s'), currval('s'));                                                                                             
INSERT 0 1

postgres=# INSERT INTO t VALUES (nextval('s'), currval('s'));
INSERT 0 1

postgres=# SELECT * FROM t;

 a | b
---+---
 0 | 0
 1 | 1
(2 rows)

postgres=# ALTER SEQUENCE s RESTART 10000;
ALTER SEQUENCE

postgres=# INSERT INTO t VALUES (nextval('s'), currval('s'));                                                                                             
INSERT 0 1

postgres=# SELECT * FROM t;

   a   |   b
-------+-------
     0 |     0
     1 |     1
 10000 | 10000
(3 rows)
```

### シーケンスビュー
<a name="limitless-reference.DDL-limitations.Sequences.views"></a>

Aurora PostgreSQL Limitless Database では、シーケンスに対して次のビューを提供します。

**rds\$1aurora.limitless\$1distributed\$1sequence**  
このビューには、分散シーケンスの状態と設定が表示されます。`minvalue`、`maxvalue`、`start`、`inc`、`cache` 列は [pg\$1sequences](https://www.postgresql.org/docs/current/view-pg-sequences.html) ビューと同じ意味を持ち、シーケンスの作成に使用されたオプションを表示します。`lastval` 列には、分散シーケンスオブジェクトの最新の割り当て値または予約値が表示されます。これは、値が既に使用されたことを意味するわけではありません。ルーターはシーケンスチャンクをローカルに保持するためです。  

```
postgres_limitless=> SELECT * FROM rds_aurora.limitless_distributed_sequence WHERE sequence_name='test_serial_b_seq';

 schema_name |   sequence_name   | lastval | minvalue |  maxvalue  | start | inc | cache
-------------+-------------------+---------+----------+------------+-------+-----+-------
 public      | test_serial_b_seq | 1250000 |        1 | 2147483647 |     1 |   1 |     1
(1 row)
```

**rds\$1aurora.limitless\$1sequence\$1metadata**  
このビューには、分散シーケンスメタデータが表示され、クラスターノードのシーケンスメタデータが集約されます。次の列を使用します。  
+ `subcluster_id` – チャンクを所有するクラスターノード ID。
+ アクティブチャンク – 使用されているシーケンスのチャンク (`active_minvalue`、`active_maxvalue`)。
+ 予約済みチャンク — 次に使用されるローカルチャンク (`reserved_minvalue`、`reserved_maxvalue`)。
+ `local_last_value` – ローカルシーケンスで最後に確認された値。
+ `chunk_size` – 作成時に設定されたチャンクのサイズ。

```
postgres_limitless=> SELECT * FROM rds_aurora.limitless_sequence_metadata WHERE sequence_name='test_serial_b_seq' order by subcluster_id;

 subcluster_id |   sequence_name   | schema_name | active_minvalue | active_maxvalue | reserved_minvalue | reserved_maxvalue | chunk_size | chunk_state | local_last_value 
---------------+-------------------+-------------+-----------------+-----------------+-------------------+-------------------+------------+-------------+------------------
 1             | test_serial_b_seq | public      |          500001 |          750000 |           1000001 |           1250000 |     250000 |           1 |           550010
 2             | test_serial_b_seq | public      |          250001 |          500000 |            750001 |           1000000 |     250000 |           1 |                 
(2 rows)
```

### シーケンスの問題のトラブルシューティング
<a name="limitless-reference.DDL-limitations.Sequences.troubleshooting"></a>

シーケンスで次の問題が発生する可能性があります。

**チャンクサイズが十分に大きくない**  
チャンクサイズが十分に大きく設定されておらず、トランザクションレートが高い場合、バックグラウンドワーカーは、アクティブチャンクを使い切る前に新しいチャンクをリクエストする時間が足りなくなる可能性があります。これにより、`LIMITLESS:AuroraLimitlessSequenceReplace`、`LWLock:LockManager`、`Lockrelation`、`LWlock:bufferscontent` などの競合イベントや待機イベントが発生する可能性があります。  
`rds_aurora.limitless_sequence_chunk_size` パラメータの値を大きくします。

**シーケンスキャッシュの設定が高すぎる**  
PostgreSQL では、シーケンスキャッシュはセッションレベルで行われます。各セッションは、シーケンスオブジェクトへの 1 回のアクセス中に連続するシーケンス値を割り当て、それに応じてシーケンスオブジェクトの `last_value` を増やします。その後、そのセッション内で次回 `nextval` を使用する際に、シーケンスオブジェクトにアクセスせずに、単純に事前に割り当てられた値を返します。  
セッション内で割り当てられたが使用されなかった番号は、セッションが終了すると失われ、シーケンスに「ホール」が発生します。これにより、sequence\$1chunk がすばやく消費され、`LIMITLESS:AuroraLimitlessSequenceReplace`、`LWLock:LockManager`、`Lockrelation`、`LWlock:bufferscontent` などの競合イベントや待機イベントが発生する可能性があります。  
シーケンスキャッシュ設定を減らします。

次の図は、シーケンスの問題によって発生する待機イベントを示しています。

![\[シーケンスの問題によって発生する待機イベント。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/limitless_sequence_waits.png)


# サポートされている/サポートされていないデータ操作言語 (DML) とクエリ処理 SQL コマンド
<a name="limitless-reference.DML-support"></a>

次の表では、Aurora PostgreSQL Limitless Database でサポートされている/サポートされていない DML コマンドと、制限事項や詳細情報を示します。


| コマンド | サポート対象? | 制限事項または詳細情報 | 
| --- | --- | --- | 
| ABORT | はい | なし | 
| ANALYZE | はい | [ANALYZE](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.ANALYZE) | 
| BEGIN | はい | なし | 
| CALL | はい | なし | 
| CHECKPOINT | はい | なし | 
| CLOSE | はい | なし | 
| CLUSTER | はい | [CLUSTER](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.CLUSTER) | 
| COMMIT | はい | なし | 
| COMMIT PREPARED | いいえ | 該当しない | 
| COPY | はい | なし | 
| DEALLOCATE | はい | なし | 
| DECLARE | はい | なし | 
| DELETE | はい | なし | 
| DISCARD | はい | なし | 
| DO | はい | なし | 
| END | はい | なし | 
| EXECUTE | はい | なし | 
| EXPLAIN | はい | [EXPLAIN](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.EXPLAIN) | 
| FETCH | はい | なし | 
| IMPORT FOREIGN SCHEMA | いいえ | 該当しない | 
| INSERT | はい | [INSERT](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.INSERT) | 
| LISTEN | いいえ | 該当しない | 
| LOCK | はい | なし | 
| MERGE | いいえ | 該当しない | 
| MOVE | はい | なし | 
| NOTIFY | いいえ | 該当しない | 
| OPEN | はい | なし | 
| PREPARE | はい | なし | 
| PREPARE TRANSACTION | いいえ | 該当しない | 
| REFRESH MATERIALIZED VIEW | いいえ | 該当しない | 
| REINDEX | いいえ | 該当しない | 
| RELEASE SAVEPOINT | はい | なし | 
| ROLLBACK | はい | なし | 
| ROLLBACK PREPARED | いいえ | 該当しない | 
| ROLLBACK TO SAVEPOINT | はい | なし | 
| SAVEPOINT | はい | なし | 
| SELECT | はい | なし | 
| SELECT INTO | はい | なし | 
| SHOW | はい | なし | 
| START TRANSACTION | はい | なし | 
| UNLISTEN | いいえ | なし | 
| UPDATE | はい | [UPDATE](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.UPDATE) | 
| UPDATE … WHERE CURRENT OF | いいえ | 該当しない | 
| VACUUM | はい | [VACUUM](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.VACUUM) | 
| VALUES | はい | なし | 

# Aurora PostgreSQL Limitless Database の DML 制限とその他の情報
<a name="limitless-reference.DML-limitations"></a>

以下のトピックでは、Aurora PostgreSQL Limitless Database での DML コマンドとクエリ処理 SQL コマンドの制限や詳細について説明します。

**Topics**
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ [CLUSTER](#limitless-reference.DML-limitations.CLUSTER)
+ [EXPLAIN](#limitless-reference.DML-limitations.EXPLAIN)
+ [INSERT](#limitless-reference.DML-limitations.INSERT)
+ [UPDATE](#limitless-reference.DML-limitations.UPDATE)
+ [VACUUM](#limitless-reference.DML-limitations.VACUUM)

## ANALYZE
<a name="limitless-reference.DML-limitations.ANALYZE"></a>

`ANALYZE` コマンドは、データベース内のテーブルの内容に関する統計を収集します。その後、クエリプランナーはこれらの統計を使用して、最も効率的なクエリの実行プランを決定します。詳細については、「PostgreSQL ドキュメント」の「[ANALYZE](https://www.postgresql.org/docs/current/sql-analyze.html)」を参照してください。

Aurora PostgreSQL Limitless Database では、`ANALYZE` コマンドは実行時にすべてのルーターとシャードのテーブル統計を収集します。

`ANALYZE` の実行中にすべてのルーターで統計情報が計算されないように、テーブル統計は 1 つのルーターで計算され、その後ピアルーターにコピーされます。

## CLUSTER
<a name="limitless-reference.DML-limitations.CLUSTER"></a>

`CLUSTER` コマンドは、インデックスに基づいてテーブルの順序を物理的に変更します。インデックスはテーブルで既に定義されている必要があります。Aurora PostgreSQL Limitless Database では、クラスタリングは各シャードに存在するインデックスの一部に対してローカルです。

詳細については、PostgreSQL ドキュメントの「[CLUSTER](https://www.postgresql.org/docs/current/sql-cluster.html)」を参照してください。

## EXPLAIN
<a name="limitless-reference.DML-limitations.EXPLAIN"></a>

次のパラメータを使用して、`EXPLAIN` コマンドからの出力を設定します。
+ `rds_aurora.limitless_explain_options` – `EXPLAIN` 出力に含める内容。デフォルト値は `single_shard_optimization` です。プランが単一シャード最適化かどうかが表示されますが、シャードプランは含まれません。

この例では、`EXPLAIN` 出力にはシャードからのプランは表示されません。

```
postgres_limitless=> EXPLAIN SELECT * FROM employees where id =25;

                      QUERY PLAN
------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
 Single Shard Optimized
(2 rows)
```

ここで、`shard_plans` と `single_shard_optimization` を含めるように `rds_aurora.limitless_explain_options` を設定します。ルーターとシャードの両方で、ステートメントの実行プランを確認できます。さらに、`enable_seqscan` パラメータを無効にして、シャードレイヤーでインデックススキャンが使用されるようにします。

```
postgres_limitless=> SET rds_aurora.limitless_explain_options = shard_plans, single_shard_optimization;
SET

postgres_limitless=> SET enable_seqscan = OFF;
SET

postgres_limitless=> EXPLAIN SELECT * FROM employees WHERE id = 25;

                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
   Remote Plans from Shard postgres_s4:
         Index Scan using employees_ts00287_id_idx on employees_ts00287 employees_fs00003  (cost=0.14..8.16 rows=1 width=15)
           Index Cond: (id = 25)
 Single Shard Optimized
(5 rows)
```

`EXPLAIN` コマンドの詳細については、PostgreSQL ドキュメントの「[EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html)」を参照してください。

## INSERT
<a name="limitless-reference.DML-limitations.INSERT"></a>

ほとんどの `INSERT` コマンドは、Aurora PostgreSQL Limitless Database でサポートされています。

PostgreSQL には明示的な `UPSERT` コマンドはありませんが、`INSERT ... ON CONFLICT` ステートメントをサポートしています。

競合アクションにサブクエリまたは可変関数が含まれている場合、`INSERT ... ON CONFLICT` はサポートされません。

```
-- RANDOM is a mutable function.
INSERT INTO sharded_table VALUES (1, 100) ON CONFLICT (id) DO UPDATE SET other_id = RANDOM();

ERROR: Aurora Limitless Tables doesn't support pushdown-unsafe functions with DO UPDATE clauses.
```

`INSERT` コマンドの詳細については、PostgreSQL ドキュメントの「[INSERT](https://www.postgresql.org/docs/current/sql-insert.html)」を参照してください。

## UPDATE
<a name="limitless-reference.DML-limitations.UPDATE"></a>

シャードキーの更新はサポートされていません。例えば、シャードキー `customer_id` を持つ `customers` というシャードテーブルがあるとします。次の DML ステートメントはエラーを引き起こします。

```
postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_id =1;
ERROR:  Shard key column update is not supported

postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_name='abc';
ERROR:  Shard key column update is not supported
```

シャードキーを更新するには、まずシャードキーを持つ行を `DELETE` し、次に更新されたシャードキー値を持つ新しい行を `INSERT` する必要があります。

`UPDATE` コマンドの詳細については、PostgreSQL ドキュメントの「[Updating data](https://www.postgresql.org/docs/current/dml-update.html)」を参照してください。

## VACUUM
<a name="limitless-reference.DML-limitations.VACUUM"></a>

シャードテーブルとリファレンステーブルの両方でバキュームを実行できます。Aurora PostgreSQL Limitless Database では、次の `VACUUM` 関数が完全にサポートされています。
+ VACUUM
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ DISABLE\$1PAGE\$1SKIPPING
+ FREEZE
+ FULL
+ INDEX\$1CLEANUP
+ PARALLEL
+ PROCESS\$1TOAST
+ TRUNCATE
+ VERBOSE

Aurora PostgreSQL Limitless Database の `VACUUM` には、次の制限があります。
+ [pg\$1visibility\$1map](https://www.postgresql.org/docs/current/pgvisibility.html) 拡張機能はサポートされていません。
+ [pg\$1stat\$1all\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-INDEXES-VIEW) ビューで未使用のインデックスをチェックすることはサポートされていません。
+ [pg\$1stat\$1user\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html)、[pg\$1class](https://www.postgresql.org/docs/current/catalog-pg-class.html)、[pg\$1stats](https://www.postgresql.org/docs/current/view-pg-stats.html) の統合ビューは実装されていません。

`VACUUM` コマンドの詳細については、PostgreSQL ドキュメントの「[VACUUM](https://www.postgresql.org/docs/current/sql-vacuum.html)」を参照してください。Aurora PostgreSQL Limitless Database でのバキューム処理の仕組みの詳細については、「[バキューム処理によるストレージ容量の再利用](limitless-vacuum.md)」を参照してください。

# Aurora PostgreSQL Limitless Database の変数
<a name="limitless-reference.variables"></a>

次の変数を使用して、Aurora PostgreSQL Limitless Database を設定できます。

**rds\$1aurora.limitless\$1active\$1shard\$1key**  
データベースのクエリ中に単一のシャードキーが設定され、これにより、すべての `SELECT` および DML クエリにシャードキーが定数述語として追加されます。詳細については、「[アクティブなシャードキーの設定](limitless-query.single-shard.md#limitless-query.single-shard.active)」を参照してください。

**rds\$1aurora.limitless\$1create\$1table\$1collocate\$1with**  
この変数を特定のテーブル名に設定して、新しく作成されたテーブルをそのテーブルとコロケーションします。詳細については、「[変数を使用した無制限テーブルの作成](limitless-creating-config.md)」を参照してください。

**rds\$1aurora.limitless\$1create\$1table\$1mode**  
テーブル作成モードを設定します。詳細については、「[変数を使用した無制限テーブルの作成](limitless-creating-config.md)」を参照してください。

**rds\$1aurora.limitless\$1create\$1table\$1shard\$1key**  
この変数を、シャードキーとして使用する列名の配列に設定します。詳細については、「[変数を使用した無制限テーブルの作成](limitless-creating-config.md)」を参照してください。

**rds\$1aurora.limitless\$1explain\$1options**  
`EXPLAIN` 出力に含める内容。詳細については、「[EXPLAIN](limitless-reference.DML-limitations.md#limitless-reference.DML-limitations.EXPLAIN)」を参照してください。

# Aurora PostgreSQL Limitless Database の DB クラスターパラメータ
<a name="limitless-reference.DBCparams"></a>

次の DB クラスターパラメータを使用して、Aurora PostgreSQL Limitless Database を設定できます。

**rds\$1aurora.limitless\$1adaptive\$1fetch\$1size**  
バッチのプリフェッチを強化します。このパラメータを `true` に設定すると、プリフェッチの自己調整 (適応型) フェッチサイズが有効になります。`false` に設定すると、フェッチサイズは一定になります。

**rds\$1aurora.limitless\$1auto\$1scale\$1options**  
DB シャードグループ内のルーターの追加またはシャードの分割に使用できるオプションを設定します。この値は `add_router`、`split_shard`、またはその両方となります。  
詳細については、[DB シャードグループにルーターを追加する](limitless-add-router.md)および[DB シャードグループ内のシャードの分割](limitless-shard-split.md)を参照してください。

**rds\$1aurora.limitless\$1distributed\$1deadlock\$1timeout**  
分散デッドロック状態があるかどうかをチェックする前にロックを待機する時間をミリ秒単位で表します。デフォルト値は `1000` (1 秒) です。  
詳細については、「[Aurora PostgreSQL Limitless Database の分散デッドロック](limitless-query.deadlocks.md)」を参照してください。

**rds\$1aurora.limitless\$1enable\$1auto\$1scale**  
DB シャードグループ内のルーターの追加とシャードの分割を有効にします。  
詳細については、[DB シャードグループにルーターを追加する](limitless-add-router.md)および[DB シャードグループ内のシャードの分割](limitless-shard-split.md)を参照してください。

**rds\$1aurora.limitless\$1finalize\$1split\$1shard\$1mode**  
システム開始のシャード分割を確定する方法を決定します。詳細については、「[DB シャードグループ内のシャードの分割](limitless-shard-split.md)」を参照してください。

**rds\$1aurora.limitless\$1maximum\$1adaptive\$1fetch\$1size**  
適応型フェッチサイズの上限を設定します。範囲は `1`～ `INT_MAX` です。デフォルト: `1000`。