|
| 1 | +--- |
| 2 | +title: _tidb_rowid |
| 3 | +summary: _tidb_rowid`とは何か、いつ利用できるのか、そして安全に使用する方法について学びましょう。 |
| 4 | +--- |
| 5 | + |
| 6 | +# <code>_tidb_rowid</code> {#code-tidb-rowid-code} |
| 7 | + |
| 8 | +`_tidb_rowid`はTiDBによって自動的に生成される非表示のシステム列です。クラスタ化インデックスを使用しないテーブルの場合、この列はテーブルの内部行IDとして機能します。テーブルスキーマでこの列を宣言または変更することはできませんが、テーブルが内部行IDとして`_tidb_rowid`使用している場合は、SQLで参照できます。 |
| 9 | + |
| 10 | +現在の実装では、 `_tidb_rowid`はTiDBによって自動的に管理される追加の`BIGINT NOT NULL`列です。 |
| 11 | + |
| 12 | +> **警告:** |
| 13 | +> |
| 14 | +> - `_tidb_rowid`常にグローバルに一意であるとは限らないことに注意してください。クラスタ化インデックスを使用しないパーティションテーブルの場合、 `ALTER TABLE ... EXCHANGE PARTITION`実行すると、異なるパーティション間で`_tidb_rowid`値が重複する可能性があります。 |
| 15 | +> - 安定した一意の識別子が必要な場合は、 `_tidb_rowid`に依存するのではなく、明示的な主キーを定義して使用してください。 |
| 16 | +
|
| 17 | +## <code>_tidb_rowid</code>が利用可能な場合 {#when-code-tidb-rowid-code-is-available} |
| 18 | + |
| 19 | +TiDBでは、テーブルが一意の行識別子としてクラスタ化された主キーを使用しない場合、各行を識別するために`_tidb_rowid`使用します。実際には、これは次のタイプのテーブルが`_tidb_rowid`使用することを意味します。 |
| 20 | + |
| 21 | +- 主キーのないテーブル |
| 22 | +- 主キーが明示的に`NONCLUSTERED`と定義されているテーブル |
| 23 | + |
| 24 | +`_tidb_rowid`は、クラスター化インデックスを使用するテーブル (つまり、主キーが`CLUSTERED`として定義されているテーブル。主キーが単一列か複合主キーかは関係ありません) では使用できません。 |
| 25 | + |
| 26 | +以下の例は、その違いを示しています。 |
| 27 | + |
| 28 | +```sql |
| 29 | +CREATE TABLE t1 (a INT, b VARCHAR(20)); |
| 30 | +CREATE TABLE t2 (id BIGINT PRIMARY KEY NONCLUSTERED, a INT); |
| 31 | +CREATE TABLE t3 (id BIGINT PRIMARY KEY CLUSTERED, a INT); |
| 32 | +``` |
| 33 | + |
| 34 | +`t1`と`t2`については、これらのテーブルは行識別子としてクラスタ化インデックスを使用していないため、 `_tidb_rowid`に対してクエリを実行できます。 |
| 35 | + |
| 36 | +```sql |
| 37 | +SELECT _tidb_rowid, a, b FROM t1; |
| 38 | +SELECT _tidb_rowid, id, a FROM t2; |
| 39 | +``` |
| 40 | + |
| 41 | +`t3`の場合、クラスタ化された主キーが既に行識別子になっているため、 `_tidb_rowid`利用できません。 |
| 42 | + |
| 43 | +```sql |
| 44 | +SELECT _tidb_rowid, id, a FROM t3; |
| 45 | +``` |
| 46 | + |
| 47 | +```sql |
| 48 | +ERROR 1054 (42S22): Unknown column '_tidb_rowid' in 'field list' |
| 49 | +``` |
| 50 | + |
| 51 | +## <code>_tidb_rowid</code>を読み込む {#read-code-tidb-rowid-code} |
| 52 | + |
| 53 | +`_tidb_rowid`使用するテーブルの場合、 `SELECT`ステートメントで`_tidb_rowid`クエリできます。これは、ページネーション、トラブルシューティング、バッチ処理などのタスクに役立ちます。 |
| 54 | + |
| 55 | +例: |
| 56 | + |
| 57 | +```sql |
| 58 | +CREATE TABLE t (a INT, b VARCHAR(20)); |
| 59 | +INSERT INTO t VALUES (1, 'x'), (2, 'y'); |
| 60 | + |
| 61 | +SELECT _tidb_rowid, a, b FROM t ORDER BY _tidb_rowid; |
| 62 | +``` |
| 63 | + |
| 64 | +```sql |
| 65 | ++-------------+---+---+ |
| 66 | +| _tidb_rowid | a | b | |
| 67 | ++-------------+---+---+ |
| 68 | +| 1 | 1 | x | |
| 69 | +| 2 | 2 | y | |
| 70 | ++-------------+---+---+ |
| 71 | +``` |
| 72 | + |
| 73 | +TiDB が行 ID に割り当てる次の値を表示するには、 `SHOW TABLE ... NEXT_ROW_ID`使用します。 |
| 74 | + |
| 75 | +```sql |
| 76 | +SHOW TABLE t NEXT_ROW_ID; |
| 77 | +``` |
| 78 | + |
| 79 | +```sql |
| 80 | ++-----------------------+------------+-------------+--------------------+-------------+ |
| 81 | +| DB_NAME | TABLE_NAME | COLUMN_NAME | NEXT_GLOBAL_ROW_ID | ID_TYPE | |
| 82 | ++-----------------------+------------+-------------+--------------------+-------------+ |
| 83 | +| update_doc_rowid_test | t | _tidb_rowid | 30001 | _TIDB_ROWID | |
| 84 | ++-----------------------+------------+-------------+--------------------+-------------+ |
| 85 | +``` |
| 86 | + |
| 87 | +## <code>_tidb_rowid</code>を書き込む {#write-code-tidb-rowid-code} |
| 88 | + |
| 89 | +デフォルトでは、TiDB は`INSERT` 、または`REPLACE`ステートメント`UPDATE` `_tidb_rowid`直接書き込むことを許可しません。 |
| 90 | + |
| 91 | +```sql |
| 92 | +INSERT INTO t(_tidb_rowid, a, b) VALUES (101, 4, 'w'); |
| 93 | +``` |
| 94 | + |
| 95 | +```sql |
| 96 | +ERROR 1105 (HY000): insert, update and replace statements for _tidb_rowid are not supported |
| 97 | +``` |
| 98 | + |
| 99 | +データインポートまたは移行中に元の行IDを保持する必要がある場合は、まずシステム変数[`tidb_opt_write_row_id`](/system-variables.md#tidb_opt_write_row_id)有効にしてください。 |
| 100 | + |
| 101 | +```sql |
| 102 | +SET @@tidb_opt_write_row_id = ON; |
| 103 | +INSERT INTO t(_tidb_rowid, a, b) VALUES (100, 3, 'z'); |
| 104 | +SET @@tidb_opt_write_row_id = OFF; |
| 105 | + |
| 106 | +SELECT _tidb_rowid, a, b FROM t WHERE _tidb_rowid = 100; |
| 107 | +``` |
| 108 | + |
| 109 | +```sql |
| 110 | ++-------------+---+---+ |
| 111 | +| _tidb_rowid | a | b | |
| 112 | ++-------------+---+---+ |
| 113 | +| 100 | 3 | z | |
| 114 | ++-------------+---+---+ |
| 115 | +``` |
| 116 | + |
| 117 | +> **警告:** |
| 118 | +> |
| 119 | +> `tidb_opt_write_row_id`はインポートおよび移行シナリオを想定しています。通常のアプリケーション書き込みには推奨されません。 |
| 120 | +
|
| 121 | +## 制限 {#restrictions} |
| 122 | + |
| 123 | +- `_tidb_rowid`という名前のユーザー列を作成することはできません。 |
| 124 | +- 既存のユーザー列の名前を`_tidb_rowid`に変更することはできません。 |
| 125 | +- `_tidb_rowid`はTiDBの内部列です。ビジネス上の主キーや長期的な識別子として扱わないでください。 |
| 126 | +- パーティション化された非クラスタ化テーブルでは、 `_tidb_rowid`値はパーティション間で一意であることが保証されません。3 `EXCHANGE PARTITION`実行した後、異なるパーティションに同じ`_tidb_rowid`値を持つ行が含まれる可能性があります。 |
| 127 | +- `_tidb_rowid`存在するかどうかは、テーブルのスキーマによって異なります。クラスタ化インデックスを持つテーブルの場合は、行識別子として主キーを使用してください。 |
| 128 | + |
| 129 | +## ホットスポットの問題に対処する {#address-hotspot-issues} |
| 130 | + |
| 131 | +`_tidb_rowid`使用するテーブルの場合、TiDB はデフォルトで行 ID を昇順で割り当てます。書き込み負荷の高いワークロードでは、これにより書き込みホットスポットが発生する可能性があります。 |
| 132 | + |
| 133 | +この問題を軽減するために(行IDとして`_tidb_rowid`を使用するテーブルの場合)、行IDをより均等に分配するために[`SHARD_ROW_ID_BITS`](/shard-row-id-bits.md)使用し、必要に応じてリージョンを事前に分割するために[`PRE_SPLIT_REGIONS`](/sql-statements/sql-statement-split-region.md#pre_split_regions)使用することを検討してください。 |
| 134 | + |
| 135 | +例: |
| 136 | + |
| 137 | +```sql |
| 138 | +CREATE TABLE t ( |
| 139 | + id BIGINT PRIMARY KEY NONCLUSTERED, |
| 140 | + c INT |
| 141 | +) SHARD_ROW_ID_BITS = 4; |
| 142 | +``` |
| 143 | + |
| 144 | +`SHARD_ROW_ID_BITS` `_tidb_rowid`使用するテーブルにのみ適用され、クラスター化インデックスを持つテーブルには適用されません。 |
| 145 | + |
| 146 | +## 関連する記述と変数 {#related-statements-and-variables} |
| 147 | + |
| 148 | +- [`SHOW TABLE NEXT_ROW_ID`](/sql-statements/sql-statement-show-table-next-rowid.md) :TiDBが次に割り当てる行IDを示します |
| 149 | +- [`SHARD_ROW_ID_BITS`](/shard-row-id-bits.md) :ホットスポットを減らすために暗黙の行IDをシャーディングする |
| 150 | +- [`Clustered Indexes`](/clustered-indexes.md) : テーブルが主キーを使用する理由を説明します`_tidb_rowid` |
| 151 | +- [`tidb_opt_write_row_id`](/system-variables.md#tidb_opt_write_row_id) : `_tidb_rowid`への書き込みを許可するかどうかを制御します |
| 152 | + |
| 153 | +## 関連項目 {#see-also} |
| 154 | + |
| 155 | +- [`CREATE TABLE`](/sql-statements/sql-statement-create-table.md) |
| 156 | +- [`AUTO_INCREMENT`](/auto-increment.md) |
| 157 | +- [非トランザクションDML](/non-transactional-dml.md) |
0 commit comments