概要 :このチュートリアルでは、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
の使用方法を学びました。 テーブルの主キーを定義するための制約。