SQLite
SQLiteでデータベースとテーブルを作成および削除する
はじめに
この記事では、SQLiteにおけるデータベースとテーブルの作成と削除について説明します。これら2つの用語を簡単に確認しましょう。
- データベース:異なる構造とデータのセットを相互に分割します。
- テーブル:データ構造を定義し、データベース内に実際のデータ値を格納します。
SQLiteは、データベースファイルを操作するためにコマンドラインを利用します。このガイドに沿って進めるには、お使いのマシン用のSQLite CLIをダウンロードする必要があります。始めましょう。
データベースの作成
まず、コマンドプロンプトにsqlite3
と入力して新しいSQLiteシェルを起動します。結果は以下のようになります。
>sqlite3SQLite version 3.32.3 2020-06-18 17:32:03Enter ".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> .databasemain: /Users/user/people.dbsqlite>
一部のユースケースでは、現在の接続に他のデータベースを追加したい場合があります。これは、以下に示すように、ATTACH DATABASE
ステートメントを使用して、test.db
をアクティブな接続に追加することで実行できます。
ATTACH DATABASE "test.db" AS test;
ここで.database
コマンドを実行すると、main
とtest
の2つのデータベース接続が返されます。
sqlite> .databasemain: /Users/user/people.dbtest: /Users/user/test.dbsqlite>
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 studentCREATE 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 --indentCREATE 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は、MySQLやPostgreSQLのような他のリレーショナルデータベースとは異なり、個別のサーバープロセスを持たないため、DROP DATABASE
ステートメントは必要ありません。SQLiteは組み込みのデータベースエンジンであるため、データベースを削除するにはマシンからファイルを削除する必要があります。この操作により、データベースはアクセスできなくなります。
まとめ
この記事では、SQLiteでデータベースとテーブルを作成および削除するための基本的な事項を説明しました。ここで紹介したコマンドは、SQLiteを始めるための最も基本的なものであり、データの整理と構造化を始めることができます。
CREATE TABLE
やDROP TABLE
などのステートメントには、ユースケースに応じて多くの追加パラメータを考慮できます。これらのステートメントの詳細については、公式SQLiteドキュメントで確認できます。
Prismaを使用する場合、Prisma Migrateを使用してデータベースとテーブルを作成できます。Prisma Migrateによる開発は、宣言型のPrismaスキーマに基づいてマイグレーションファイルを生成し、それらをデータベースに適用します。