

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# `CREATE INDEX`
<a name="create-index-syntax-support"></a>

`CREATE INDEX` 會定義新的索引。在 Aurora DSQL 中，索引建立一律為非同步，因此您必須指定`ASYNC`關鍵字。如需 Aurora DSQL 如何執行非同步索引建置以及如何監控它們的資訊，請參閱 [Aurora DSQL 的非同步索引](working-with-create-index-async.md)。

## 支援的語法
<a name="create-index-supported-syntax"></a>

```
CREATE [ UNIQUE ] INDEX ASYNC [ [ IF NOT EXISTS ] name ] ON table_name
    ( { column_name | ( expression ) } [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( column_name [, ...] ) ]
    [ NULLS [ NOT ] DISTINCT ]
```

## 說明
<a name="create-index-description"></a>

`CREATE INDEX` 在指定資料表的指定資料欄上建構索引。索引主要用於增強資料庫效能，但不當使用可能會導致效能降低。

您可以將索引的索引鍵欄位指定為欄名稱，或者指定為以括號寫入的表達式。您可以指定多個欄位來建立多欄索引。

索引欄位可以是根據資料表資料列中一或多個資料欄的值計算的表達式。使用此功能可根據基本資料的某些轉換來快速存取資料。例如，在 上運算的索引`upper(col)`允許 子句`WHERE upper(col) = 'JIM'`使用 索引。

索引定義中使用的所有函數和運算子都必須不可變。也就是說，其結果必須僅倚賴其引數，絕不倚賴任何外部影響，例如另一個資料表的內容或目前時間。此限制可確保索引的行為已妥善定義。若要在索引表達式中使用使用者定義的函數，請記得在建立函數`IMMUTABLE`時標記函數。

## Parameters
<a name="create-index-parameters"></a>

**`UNIQUE`**  
讓系統在建立索引時、資料是否已存在，以及每次新增資料時檢查資料表中是否有重複的值。嘗試插入或更新會導致重複項目的資料會產生錯誤。

**`IF NOT EXISTS`**  
如果具有相同名稱的關係已存在，請勿擲回錯誤。在此情況下會發出通知。請注意，我們無法保證現有的索引類似於已建立的索引。`IF NOT EXISTS` 指定 時，需要索引名稱。

**`INCLUDE`**  
選用的 `INCLUDE` 子句會指定要包含在索引中的資料欄清單，做為*非索引鍵*資料欄。您無法在索引掃描搜尋資格中使用非索引鍵資料欄，且 Aurora DSQL 會基於索引強制執行的任何唯一性或排除限制而忽略該資料欄。不過，僅索引掃描可以傳回非索引鍵資料欄的內容，而不必造訪索引的資料表，因為它們可直接從索引項目取得。因此，新增非索引鍵資料欄可讓索引限定的掃描查詢無法使用。  
不支援將運算式做為包含的資料欄，因為它們無法用於僅限索引的掃描。

**{{name}}**  
要建立的索引名稱。您無法在此處包含結構描述名稱。Aurora DSQL 一律會在與其父資料表相同的結構描述中建立索引。索引的名稱必須與任何其他關係的名稱不同，例如該結構描述中的資料表、序列、索引或檢視。如果您省略名稱，Aurora DSQL 會根據父資料表的名稱和索引欄名稱來選擇適當的名稱。

**{{table\_name}}**  
要編製索引之資料表的名稱，選擇性符合結構描述資格。

**{{column\_name}}**  
資料表資料欄的名稱。

**{{表達式}}**  
以資料表的一或多個資料欄為基礎的表達式。您通常必須使用周圍的括號撰寫表達式，如語法所示。不過，如果表達式具有函數呼叫的形式，您可以省略括號。

**`NULLS FIRST`**  
指定 Null 在非 Null 之前排序。

**`NULLS LAST`**  
指定 Null 在非 Null 之後排序。

**`NULLS DISTINCT``NULLS NOT DISTINCT`**  
指定 Null 值是否被視為不同，也就是不等於唯一索引。預設為不同，因此唯一索引可以在資料欄中包含多個 null 值。

## 範例
<a name="create-index-examples"></a>

在資料表 `title` 中的 欄上建立唯一索引`films`。

```
CREATE UNIQUE INDEX ASYNC title_idx ON films (title);
```

在`title`包含資料欄的資料欄上建立唯一索引，`director`並在資料表 `rating`中建立`films`。

```
CREATE UNIQUE INDEX ASYNC title_idx ON films (title) INCLUDE (director, rating);
```

在表達式 上建立索引`lower(title)`，允許有效率的不區分大小寫搜尋。

```
CREATE INDEX ASYNC ON films ((lower(title)));
```

此範例會省略索引名稱，因此 Aurora DSQL 選擇名稱，通常是 `films_lower_idx`。

建立具有 null 非預設排序順序的索引。

```
CREATE INDEX ASYNC title_idx_nulls_low ON films (title NULLS FIRST);
```