共有する

はじめに

この記事では、SQLiteにおけるデータベーステーブルの作成と削除について説明します。これら2つの用語を簡単に確認しましょう。

  • データベース:異なる構造とデータのセットを相互に分割します。
  • テーブル:データ構造を定義し、データベース内に実際のデータ値を格納します。

SQLiteは、データベースファイルを操作するためにコマンドラインを利用します。このガイドに沿って進めるには、お使いのマシン用のSQLite CLIをダウンロードする必要があります。始めましょう。

データベースの作成

まず、コマンドプロンプトにsqlite3と入力して新しいSQLiteシェルを起動します。結果は以下のようになります。

>sqlite3
SQLite version 3.32.3 2020-06-18 17:32:03
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

デフォルトでは、SQLiteセッションはインメモリデータベースを使用して開始されます。これは、現在ファイルから読み込んでいないことを意味します。

すでに永続的なデータベースがある場合、.open <FILENAME>コマンドを使用して既存のファイルを開くことができます。例えば、以下のコマンドでは、既存のtest.dbデータベースが開かれます。

.open test.db

:存在しないファイル名を指定した場合、sqlite3ツールはデータベースファイルを作成します。

新しいデータベースをより明示的に作成するには、.open <FILENAME>コマンドに--newを追加します。ここでは、people.dbを作成することでコマンドを示します。

.open --new people.db

これにより、セッションの残りの間、既存の変更が指定されたデータベースファイルに保存されます。

データベース接続の一覧表示

データベースを作成したら、.databaseコマンドを使用して接続を確認できます。

.database

以下は、mainデータベースが表示されたときのコマンドの戻り値の例です。

sqlite> .database
main: /Users/user/people.db
sqlite>

一部のユースケースでは、現在の接続に他のデータベースを追加したい場合があります。これは、以下に示すように、ATTACH DATABASEステートメントを使用して、test.dbをアクティブな接続に追加することで実行できます。

ATTACH DATABASE "test.db" AS test;

ここで.databaseコマンドを実行すると、maintestの2つのデータベース接続が返されます。

sqlite> .database
main: /Users/user/people.db
test: /Users/user/test.db
sqlite>

SQLiteでデータベース内にテーブルを作成する

データベースが作成され、接続が確認されたら、データベースにデータ構造を導入し始めることができます。

SQLiteのCREATE TABLEコマンドの使い方

このセクションでは、新しく作成したpeople.dbデータベースにstudentテーブルを作成してデータ構造を追加します。データベース内にテーブルを作成するには、次の構文でCREATE TABLEステートメントを使用します。

CREATE TABLE student (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER,
student_email TEXT NOT NULL,
class TEXT
);

上記のステートメントを以下の要素に分解できます。

  • CREATE TABLE <table name>:これは基本的なコマンドステートメントです。この例では、<table name>studentであり、テーブルに付けたい任意の名前であるべきです。
  • <column name> <data type>:この構文は、テーブル内の基本的な列を定義します。この例では、列名はfirst_nameであり、SQLiteデータ型で定義された対応するデータ型はTEXTです。
  • <column constraint>:列制約は、テーブルに入力されるデータに追加要件を追加するオプションの制約です。この例では、Not Nullという列制約がstudent_email列に追加されています。これにより、この列が入力されない限りエントリが作成されないことが保証されます。
  • <table constraint>:列制約と同様に、テーブル制約はデータに追加要件を追加するためにオプションです。単一の列ではなく複数の列の相互作用に制約が影響する場合に例外があります。この例では、idフィールドへのPRIMARY KEYの追加がテーブル制約の一例です。

It is important to note that the CREATE TABLE statement will create the table you specify in the main database by default. If you have multiple connections open to databases, you need to specify <database>.<table> in your statement to create the table in a database other than main. Adjusting the previous example will look like this to create the table in test

CREATE TABLE test.student (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER,
student_email TEXT NOT NULL,
class TEXT
);

テーブルがまだ存在しない場合にのみ作成する方法

テーブルがまだ存在しないことを確認するために、オプションのIF NOT EXISTS句を前の例に次のように追加できます。

CREATE TABLE IF NOT EXISTS student (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER,
student_email TEXT NOT NULL,
class TEXT
);

SQLiteは、デフォルトではIF NOT EXISTS句なしで既に存在するテーブルを作成しようとするとエラーをスローします。この句を追加することで、デフォルトの動作がエラーではなく警告で上書きされます。コマンドの残りの動作は同じままです。

.schemaでテーブルを検証する方法

テーブルを作成した後、.schemaコマンドを使用してテーブルの構造を確認できます。以前に作成したstudentテーブルが意図したとおりに構造化されていることを確認したい場合は、次の構文を使用して確認できます。

.schema student

studentテーブルの戻り結果は以下のようになります。

sqlite> .schema student
CREATE TABLE student (id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT, age INTEGER, student_email TEXT NOT NULL, class TEXT);
sqlite>

より読みやすい結果を得るには、.fullschema --indentコマンドを使用できます。これにより、接続されたデータベースのスキーマがより良い間隔で表示されます。

.fullschema --indent
sqlite> .fullschema --indent
CREATE TABLE student (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
age INTEGER,
student_email TEXT NOT NULL,
class TEXT
);
sqlite>

.fullschemaコマンドには、統計テーブルが存在する場合はそのダンプも含まれます。ここでは扱いませんが、場合によってはこの出力が役立つことがあります。

テーブルの削除

SQLiteでデータベースからテーブルを削除するには、DROP TABLEステートメントを使用します。studentテーブルを削除するには、このステートメントを次のように使用します。

DROP TABLE IF EXISTS student;

テーブルを削除する際、IF EXISTSステートメントはオプションです。このステートメントを追加することで、テーブルが存在する場合にのみコマンドが実行されるようになります。存在しない場合は、ステートメントは単純に無視され、何も起こりません。

データベースの削除

SQLiteは、MySQLPostgreSQLのような他のリレーショナルデータベースとは異なり、個別のサーバープロセスを持たないため、DROP DATABASEステートメントは必要ありません。SQLiteは組み込みのデータベースエンジンであるため、データベースを削除するにはマシンからファイルを削除する必要があります。この操作により、データベースはアクセスできなくなります。

まとめ

この記事では、SQLiteでデータベースとテーブルを作成および削除するための基本的な事項を説明しました。ここで紹介したコマンドは、SQLiteを始めるための最も基本的なものであり、データの整理と構造化を始めることができます。

CREATE TABLEDROP TABLEなどのステートメントには、ユースケースに応じて多くの追加パラメータを考慮できます。これらのステートメントの詳細については、公式SQLiteドキュメントで確認できます。

著者について
Alex Emerich

アレックス・エメリック

アレックスは、典型的なバードウォッチング好きでヒップホップを愛する本の虫であり、データベースについても書くのを楽しんでいます。現在ベルリンに住んでおり、レオポルド・ブルームのように街をあてもなく歩いている姿が見られます。
© . All rights reserved.