SQLite テーブルの作成、変更、削除と例
⚡ スマートサマリー
SQLite テーブル管理は、テーブルを定義するCREATE TABLE、テーブル名を変更したり列を追加・変更したりするALTER TABLE、データベースからテーブルを完全に削除するDROP TABLEという3つのデータ定義コマンドに依存しています。

以下のセクションでは、テーブルの作成、構造の変更、および削除の方法を示します。 SQLite3つの例を用いて、CREATE TABLE、ALTER TABLE、およびDROP TABLEコマンドを解説します。
SQLite テーブルを作成
構文
以下は CREATE TABLE ステートメントの構文です。
CREATE TABLE table_name( column1 datatype, column1 datatype );
テーブルを作成するには、次のように「CREATE TABLE」クエリを使用する必要があります。
CREATE TABLE guru99 ( Id Int, Name Varchar );
テーブル名の後の 2 つの括弧内でテーブルの列を定義します。各列には次のプロパティが必要です。
- 名前、列名はテーブルの列間で一意である必要があります。
- データ型 ― 列のデータ型。
- 列の制約はオプションです。これについては、このチュートリアルの後半のセクションで説明します。
SQLite テーブルが存在しない場合は作成します
スクリプトが複数回実行される場合、テーブルが既に存在すると、単純なCREATE TABLE文は失敗し、エラーで停止します。 SQLite この問題を解決するには、オプションの IF NOT EXISTS 句を使用します。この句は、テーブルが存在しない場合にのみテーブルを作成し、既に存在する場合は何も行いません。
CREATE TABLE IF NOT EXISTS guru99 ( Id Int, Name Varchar );
上記の記述は「テーブルが既に存在します」というエラーを発生させないため、セットアップスクリプトや移行スクリプトの先頭に記述しても安全です。
テーブルを削除する場合も、同じ考え方が逆の形で適用されます。DROP TABLE に IF EXISTS を追加することで、テーブルが既に削除されている場合のエラーを回避できます。
DROP TABLE IF EXISTS guru99;
どちらの句も自動化スクリプトではよく使われます。なぜなら、実行の合間に手動でクリーンアップすることなく、同じファイルを繰り返し実行できるからです。
ドロップテーブル
テーブルを削除するには、「DROP TABLE」コマンドの後にテーブル名を指定します。例:
DROP TABLE guru99;
他の机
テーブルの名前を変更するには、「ALTER TABLE」コマンドを次のように使用します。
ALTER TABLE guru99 RENAME TO guru100;
テーブル名が変更されたことを確認するには、「.tables」コマンドを使用してテーブルの一覧を表示します。すると、テーブル名が以下のように変更されているはずです。
ご覧のとおり、「alter table」コマンドを実行すると、テーブル名「guru99」が「guru100」に変更されます。
SQLite 列の追加 - ALTER TABLE コマンドの使用
列を追加するには、「ALTER TABLE」コマンドを使用することもできます。
ALTER TABLE guru100 ADD COLUMN Age INT;
これにより、「guru100」テーブルが変更され、新しい列「年齢」が追加されます。
出力が表示されなかった場合、ステートメントは正常に実行され、列が追加されたことを意味します。出力がない場合、カーソルは「sqlite>」の後にテキストなしで配置されます。例:
ただし、列が追加されたことを確認するには、「.schema guru100」コマンドを使用できます。これによりテーブル定義が表示され、先ほど追加した新しい列が表示されるはずです。
SQLite テーブルの変更:列名の変更と削除
列を追加するだけでなく、現代のバージョンでは SQLite 単一の列の名前を変更したり、列を削除したりすることもできます。列の名前変更は、 SQLite 3.25では、テーブル定義内だけでなく、その列を参照するすべてのインデックス、トリガー、ビュー内の名前も更新されます。
ALTER TABLE guru100 RENAME COLUMN Name TO FullName;
列を削除するには、 SQLite 3.35以降では、直接DROP COLUMN句をサポートしています。
ALTER TABLE guru100 DROP COLUMN Age;
列が主キー、一意制約、またはインデックスの一部である場合、その列を削除することはできません。 SQLite DROP COLUMN がないバージョンでは、従来の回避策として、必要な列を持つ新しいテーブルを作成し、行をコピーし、古いテーブルを削除し、最後に新しいテーブルの名前を変更します。
テーブルをコピーする方法 SQLite CREATE TABLE AS SELECT を使用する
危険な変更を行う前のバックアップとして、あるいは新しいテーブルを作成する際の出発点として、テーブルのコピーが必要になる場合があります。 SQLite CREATE TABLE AS SELECT を使用すると、これを 1 つのステップで構築できます。これは、クエリから取得した列を持つ新しいテーブルを作成し、そのクエリが返す行でテーブルを埋めます。
CREATE TABLE guru100_backup AS SELECT * FROM guru100;
新しいテーブル「guru100_backup」は、「guru100」から同じ列とすべての行を受け取ります。一部の行のみをコピーするには、SELECT文にWHERE句を追加します。
CREATE TABLE known_ages AS SELECT * FROM guru100 WHERE Age IS NOT NULL;
覚えておくべき重要な点は、CREATE TABLE AS SELECT では列名、型、データはコピーされますが、主キー、その他の制約、インデックスはコピーされないということです。コピーしたテーブルが元のテーブルと同じルールを適用する必要がある場合は、それらを新しいテーブルに自分で追加する必要があります。
SQLite テーブルに値を挿入する
テーブルに値を挿入するには、次のように「INSERT INTO」ステートメントを使用します。
INSERT INTO Tablename(colname1, colname2, ….) VALUES(valu1, value2, ….);
テーブル名の後の列名を省略して、次のように記述できます。
INSERT INTO Tablename VALUES(value1, value2, ….);
テーブルから列名を省略している場合、挿入される値の数はテーブルの列の数と正確に同じである必要があります。その後、各値は対応する列に挿入されます。たとえば、次の挿入ステートメントの場合:
INSERT INTO guru100 VALUES(1, 'Mike', 25);
このステートメントの結果は次のようになります。
- 「id」列には値「1」が挿入されます。
- 「名前」列には「Mike」という値が挿入され、
- 「年齢」列には値「25」が挿入されます。
INSERT … DEFAULT VALUES ステートメント
次のように、テーブルに列のデフォルト値を一度に設定できます。
INSERT INTO Tablename DEFAULT VALUES;
列がNULL値もデフォルト値も許可していない場合、その列に対して「NOT NULL制約違反」というエラーが表示されます。以下はその例です。





