概要 :このチュートリアルでは、SQLite PRIMARY KEYの使用方法を学習します テーブルの主キーを定義するための制約。
SQLite主キーの概要
主キーは、テーブル内の行の一意性を識別するために使用される列または列のグループです。各テーブルには主キーが1つだけあります。
SQLiteでは、次の2つの方法で主キーを定義できます。
まず、主キーの列が1つしかない場合は、PRIMARY KEYを使用します。 主キーを次のように定義するための列制約:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);Code language: PHP (php)
次に、主キーが2つ以上の列で構成されている場合は、PRIMARY KEYを使用します。 次のステートメントに示すように、プライマリを定義するためのテーブル制約。
CREATE TABLE table_name(
column_1 INTEGER NOT NULL,
column_2 INTEGER NOT NULL,
...
PRIMARY KEY(column_1,column_2,...)
);Code language: SQL (Structured Query Language) (sql)
SQL標準では、主キー列にNULLを含めることはできません。 値。これは、主キー列に暗黙のNOT NULLがあることを意味します 制約。
ただし、SQLiteの現在のバージョンを以前のバージョンと互換性を持たせるために、SQLiteでは主キー列にNULLを含めることができます。 値。
SQLiteの主キーとROWIDテーブル
WITHOUT ROWIDを指定せずにテーブルを作成する場合 オプションの場合、SQLiteはrowidという暗黙の列を追加します 64ビットの符号付き整数を格納します。 rowid columnは、テーブル内の行を一意に識別するキーです。 rowidを持つテーブル 列はrowidと呼ばれます テーブル。
テーブルに1つの列で構成される主キーがあり、その列がINTEGERとして定義されている場合 次に、この主キー列はエイリアスになります rowidの場合 列。
BIGINTなどの別の整数型を割り当てる場合は注意してください およびUNSIGNED INT 主キー列に対して、この列はrowidのエイリアスにはなりません 列。
rowid テーブルは、データをBツリーとして編成し、rowidのデータをクエリおよび並べ替えます。 テーブルは非常に高速です。 rowidのエイリアスではない主キーを使用するよりも高速です 。
もう1つの重要な注意点は、INTEGERを使用して列を宣言する場合です。 タイプとPRIMARY KEY DESC 句を指定すると、この列はrowidのエイリアスにはなりません 列:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);Code language: SQL (Structured Query Language) (sql) SQLiteの主キーの例を作成する
次のステートメントは、countriesという名前のテーブルを作成します country_idがあります 主キーとしての列。
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql) 試してみてください
countriesの主キーは テーブルには列が1つしかないため、PRIMARY KEYを使用して主キーを定義しました 列の制約。
PRIMARY KEYを使用することができます 次のステートメントに示すように、1つの列で構成される主キーを定義するためのテーブル制約:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);Code language: SQL (Structured Query Language) (sql) 試してみてください
ただし、主キーが複数の列で構成されているテーブルの場合は、PRIMARY KEYを使用する必要があります。 主キーを定義するためのテーブル制約。
次のステートメントは、country_languagesを作成します 主キーが2つの列で構成されているテーブル。
CREATE TABLE country_languages (
country_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
PRIMARY KEY (country_id, language_id),
FOREIGN KEY (country_id) REFERENCES countries (country_id)
ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (language_id) REFERENCES languages (language_id)
ON DELETE CASCADE ON UPDATE NO ACTION
);Code language: PHP (php) 試してみてください
SQLiteの主キーの例を追加する
MySQLやPostgreSQLなどの他のデータベースシステムとは異なり、ALTER TABLEを使用することはできません。 既存のテーブルに主キーを追加するステートメント。
制限を回避するには、次の手順に従う必要があります。
- まず、外部キーの制約チェックをオフに設定します。
- 次に、テーブルの名前を別のテーブル名(old_table)に変更します
- 次に、名前を変更したテーブルの正確な構造で新しいテーブル(テーブル)を作成します。
- その後、データをold_tableからテーブルにコピーします。
- 最後に、外部キー制約チェックをオンにします
次のステートメントを参照してください:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table RENAME TO old_table;
-- define the primary key constraint here
CREATE TABLE table ( ... );
INSERT INTO table SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;Code language: SQL (Structured Query Language) (sql) 試してみてください
BEGIN TRANSACTION 新しいトランザクションを開始します。これにより、後続のすべてのステートメントが正常に実行されるか、何も実行されないことが保証されます。
COMMIT ステートメントはすべてのステートメントをコミットします。
テーブル名citiesを作成しましょう 主キーなし。
CREATE TABLE cities (
id INTEGER NOT NULL,
name text NOT NULL
);
INSERT INTO cities (id, name)
VALUES(1, 'San Jose');Code language: SQL (Structured Query Language) (sql) 試してみてください
citiesに主キーを追加するため テーブルでは、次の手順を実行します。
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE cities RENAME TO old_cities;
CREATE TABLE cities (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO cities
SELECT * FROM old_cities;
DROP TABLE old_cities;
COMMIT;
PRAGMA foreign_keys=on;Code language: SQL (Structured Query Language) (sql) 試してみてください
SQLite GUIツールを使用する場合は、次のステートメントを使用してテーブルの情報を表示できます。
PRAGMA table_info([cities]);Code language: SQL (Structured Query Language) (sql) 試してみてください
このチュートリアルでは、SQLiteのPRIMARY KEYの使用方法を学びました。 テーブルの主キーを定義するための制約。