MySQL - テーブル
概要
テーブルの作成
文字コード
テーブルの作成時において、文字コードを指定する。
CREATE TABLE <テーブル名> (
<カラム名 1> <型名>
<カラム名 2> <型名>
-- ...略
CHARACTER SET=utf8mb4 -- テーブル全体の文字コードをutf8mb4に指定する場合
);
-- または
CREATE TABLE <テーブル名> (
<カラム名 1> <型名> CHARACTER SET=utf8mb4 -- 特定のカラムの文字コードをutf8mb4に指定する場合
<カラム名 2> <型名>
-- ...略
);
MySQLのデフォルトの文字コードを確認する。
Show Variables Like "chara%";
MySQLのデフォルトの文字コードを設定する場合は、my.cnfファイルを編集する。
my.cnfファイルを変更した後は、MySQLを再起動する必要がある。
# my.cnfファイル
[mysqld]
character-set-server=utf8mb4 # MySQLサーバのデフォルトの文字コードを指定する
[client]
default-character-set=utf8mb4 # MySQLクライアントのデフォルトの文字コードを指定する
既存のテーブルの文字コードは、INFORMATION_SCHEMAデータベースのTABLESテーブルから確認することができる。
TABLE_COLLATION
カラムの値が、そのテーブルに設定された文字コードに相当する。
SELECT TABLE_NAME,TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='<データベース名>';
既存のテーブルの文字コードを変更する。
ALTER TABLE <テーブル名> CONVERT TO CHARACTER SET <文字コード>;
# 例: 文字コードをutf8mb4に変更
ALTER TABLE <テーブル名> CONVERT TO CHARACTER SET utf8mb4
既存のテーブルの存在を確認して作成
既存のテーブルが存在していない場合はテーブルを作成する。
これは、テーブルの重複、または、既存のテーブルを上書き/削除することを防ぐことができる。
CREATE TABLE IF NOT EXISTS <テーブル名> (
<カラム名 1> <型名>
CHARACTER SET=utf8mb4 -- 文字コード
COLLATE utf8mb4_general_ci -- 照合順序
);
テーブルのクローニングおよびコピー
CREATE TABLE ... LIKE
文、または、CREATE TABLE ... AS SELECT
文を使用して、
元のテーブルに定義されているカラム属性やインデックス等、別のテーブルの定義に基づいて空のテーブルを作成する。
CREATE TABLE <新しいテーブル名> LIKE <クローン元のテーブル名>;
-- または
CREATE TABLE <新しいテーブル名> AS SELECT * FROM <クローン元のテーブル名>;
一時テーブルの作成
MySQLでは、一時テーブルは現在のセッション内でのみ表示され、セッションがクローズされると自動的に削除される。
つまり、複数の異なるセッションが同じ一時テーブル名を使用することができ、互いに、同じ名前の既存の一時テーブル以外のテーブルと競合することはない。
(既存のテーブルは、一時テーブルが削除されるまで非表示になる)
InnoDBでは、圧縮一時テーブルはサポートされていない。
innodb_strict_mode
オプションが有効(デフォルト)な場合、
ROW_FORMAT=COMPRESSED
、または、KEY_BLOCK_SIZE
が指定されている場合、CREATE TEMPORARY TABLE
文はエラーとなる。
innodb_strict_mode
オプションが無効な場合は、警告が出力されて、圧縮されていない行形式を使用して一時テーブルが作成される。
innodb_file_per-table
オプションは、InnoDB一時テーブルの作成には影響しない。
CREATE TEMPORARY TABLE <テーブル名> (
<カラム名 1> <型名> <カラム 1のオプション>
<カラム名 2> <型名> <カラム 2のオプション>
-- ...略
);
-- または
CREATE TEMPORARY TABLE IF NOT EXISTS <テーブル名> (
<カラム名 1> <型名> <カラム 1のオプション>
<カラム名 2> <型名> <カラム 2のオプション>
-- ...略
);
一時テーブルを作成するには、CREATE TEMPORARY TABLES
権限が必要となる。
ただし、セッションが一時テーブルを作成した後は、サーバはそのテーブルに対するそれ以上の権限を確認しないため、
セッションの作成により、DROP TABLE
文、INSERT
文、UPDATE
文、SELECT
文等のあらゆる操作をテーブル上で実行できる。
一時テーブルは、データベース(スキーマ)と非常に疎な関係を持っており、データベースの削除後も、そのデータベース内で作成された一時テーブルは自動的には削除されない。
※注意
START TRANSACTION
文またはBEGIN
文の中において、一時テーブルを作成後にROLLBACK
文を実行する場合、
一時テーブル自体は削除されないが、レコードは全ては削除される。
つまり、一時テーブルを作成するCREATE TEMPORARY TABLE
文は、ROLLBACK
文の対象にならず、レコードを複製する箇所のみがロールバックされる。
照合順序
照合順序とは
MySQLにおいて、照合順序(Collation)はテーブルや列ごとに設定することができる。
照合順序は、文字列の比較やソートの際に使用され、異なる言語や地域に合わせてテキストの比較を行うために重要である。
MySQLでは、様々な照合順序が提供されている。
例えば、大文字小文字を区別やアクセントを考慮するかどうか等の違いがある。
- utf8mb4_general_ci
- 大文字小文字を区別せず、アクセントを区別しない。
- 通常の比較の場合には適しているが、文字の並び順は一般的な場合に従う。
- utf8mb4_bin
- バイナリ比較を行う。
- 大文字小文字やアクセント等を区別して、バイト単位で比較する。
- これは厳密なバイナリ比較が必要な場合に使用される。
- utf8_general_ci
- utf8mb4と同様、大文字小文字を区別せず、アクセントを区別しない。
- ただし、utf8mb4よりも少ない文字セットを使用する。
- latin1_swedish_ci
- ラテン1文字セットに基づいた照合順序であり、スウェーデンの標準に従う。
- 大文字小文字を区別せず、アクセントを区別しない。
照合順序の詳細を知りたい場合は、MySQLの公式ドキュメントを参照すること。
使用できる照合順序の確認
使用できる文字コードと照合順序の組み合わせは、INFORMATION_SCHEMA
データベースのCOLLATION_CHARACTER_SET_APPLICABILITY
テーブルから確認できる。
利用できる照合順序がMySQLのバージョンによって異なるため、どのような照合順序が使用できるかどうかを確認する必要がある。
SELECT COLLATION_NAME,CHARACTER_SET_NAME
FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY
WHERE COLLATION_NAME='<照合順序>';
-- 例: 照合順序にutf8mb4_general_ciが使用できるかどうかを確認
SELECT COLLATION_NAME,CHARACTER_SET_NAME
FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY
WHERE COLLATION_NAME='utf8mb4_general_ci';
カラムの文字コードと照合順序の確認
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = '<テーブル名>'
AND table_schema = '<データベース名>' -- オプション
AND column_name LIKE '<ワイルドカード>' -- オプション
テーブル作成時における照合順序の指定
以下の例では、データベースの作成時において、照合順序をutf8mb4_unicode_ciに指定している。
CREATE TABLE <テーブル名> (
<カラム名 1> VARCHAR(255) COLLATE utf8mb4_unicode_ci,
<カラム名 2> INT
);
CREATE TABLE <テーブル名> (
<カラム名 1> VARCHAR(255) COLLATE utf8_general_ci,
<カラム名 2> INT,
<カラム名 3> TEXT COLLATE utf8_unicode_ci
);
※注意
テーブル全体に対する照合順序を一括で指定する方法は提供されていないことに注意する。
既存のテーブルやカラムの照合順序の変更
既存のテーブルやカラムの照合順序を変更することも可能である。
テーブルの照合順序の変更
テーブルの照合順序を変更する。
ただし、各カラムの照合順序は変更されないことに注意する。
ALTER TABLE tbl_name
CHARACTER SET <文字コード>
COLLATE <照合順序>
-- 例: sample_tableテーブルの照合順序をutf8mb4_general_ciに変更する
ALTER TABLE sample_table
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci
全ての文字カラムの照合順序の変更
全ての文字カラムの文字コードおよび照合順序を変更する。
これは、テーブルの文字コードと各カラムの文字コードを揃える時に使用すると便利である。
ALTER TABLE <テーブル名>
CONVERT TO CHARACTER SET <文字コード>
COLLATE <照合順序>
-- 例: sample_tableテーブルの文字コードをutf8mb4、照合順序をutf8mb4_general_ciに変更する
ALTER TABLE sample_table
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci
任意のカラムの照合順序の変更
以下の例では、テーブルの任意のカラムの照合順序をutf8mb4_unicode_ci
に変更している。
ALTER TABLE <テーブル名> MODIFY <カラム名> <カラムの型名: CHAR, VARCHAR, TEXT> COLLATE utf8mb4_unicode_ci;
-- 例: sample_tableテーブルのsample_colカラムをutf8mb4_unicode_ciに変更する
ALTER TABLE sample_table MODIFY sample_col VARCHAR(255) COLLATE utf8mb4_unicode_ci;
デフォルトの照合順序
テーブルにおけるデフォルトの照合順序を確認する場合、
テーブル自体に照合順序が指定されていない場合、テーブルはデータベースのデフォルトの照合順序を継承する。
デフォルトのテーブル照合順序を確認する。
SHOW TABLE STATUS LIKE '<テーブル名>';
これは、テーブルのステータス情報を表示する。
出力結果において、Collation
カラムの値がテーブルの照合順序である。
もし、テーブルに照合順序が指定されていない場合、データベースのデフォルトの照合順序が表示される。
テーブルの削除
DROP TABLE
文により削除したテーブルは、復元することができないことに注意する。
DROP TABLE <テーブル名>;
複数のテーブルを一括して削除する場合、カンマ区切りでテーブル名を列挙する。
DROP TABLE <テーブル名 1>, <テーブル名 2>, <テーブル名 3>;
レコードの削除
DELETE文
DELETE
文は、テーブル内のレコードを削除するクエリである。
DELETE FROM <テーブル名>;
WHERE
句で条件を指定しない場合、テーブル内の全てのデータが削除される。
特定のレコードのみを削除する場合は、必ずWHERE
句で条件指定をする。
DELETE FROM <テーブル名> WHERE <カラム名> = <値>;
TRUNCATE文
TRUNCATE
文は、テーブル内のレコードを完全に削除するクエリである。
TRUNCATE
文はDELETE
文とは異なり、WHERE
句での条件指定ができない。
そのため、テーブル内のレコードは必ず全て削除される。
TRUNCATE TABLE <テーブル名>;
TRUNCATE
文は、条件を指定してデータの削除ができないことに注意する。
テーブルの確認
現在使用しているデータベースのテーブルを確認する。
USE <データベース名>;
SHOW TABLES;
制約
NOT NULL
NULL値を禁止する。
CREATE TABLE product
(
product_id INT PRIMARY KEY,
product_name VARCHAR(16) UNIQUE NOT NULL,
price INT
);
CHECK
条件を指定して、条件を満たさないデータを禁止する。
CREATE TABLE user
(
user_id INT PRIMARY KEY,
age INT,
city_code CHAR(4),
gender CHAR(1),
CONSTRAINT agecity_check CHECK(age >= 18 OR city_code = '0003'),
CONSTRAINT gendercheck CHECK(gender IN('M', 'F')))
);
UNIQUE KEY
- 重複したデータを禁止する。
- 複数のカラムに設定できる。
- ただし、
NULL
を禁止するわけではない。
CREATE TABLE user
(
user_id INT PRIMARY KEY,
telephone CHAR(8),
addreess VARCHAR(255),
UNIQUE (telephone, address)
);
PRIMARY KEY
- 一意を保証する。
- 重複と
NULL
を禁止する。 - 1つのテーブルに1つしか指定できない。
CREATE TABLE user
(
user_id INT PRIMARY KEY,
telephone CHAR(8),
age INT
);
複合主キーも指定できる。
CREATE TABLE price
(
shop_code CHAR(4),
product_code CHAR(4),
price INT,
PRIMARY KEY(shop_code , product_code)
);
FOREIGN KEY
他のテーブルのカラムを参照して、そのカラムに存在しないデータを禁止する。
CREATE TABLE order
(
order_id INT PRIMARY KEY,
shop_code CHAR(5),
product_code CHAR(4),
number INT,
date DATE,
FOREIGN KEY (shop_code)
REFERENCES shop_table(shop_code),
FOREIGN KEY (product_code)
REFERENCES product_table(product_code)
);
2つのカラムを外部参照することもできる。
CREATE TABLE item
(
maker_id CHAR(10),
product_id CHAR(10),
PRIMARY KEY (maker_id , product_id)
);
CREATE TABLE dealer
(
shop_id CHAR(10) NOT NULL,
maker_id CHAR(10) NOT NULL,
product_id CHAR(10) NOT NULL,
PRIMARY KEY (shop_id , maker_id , product_id),
FOREIGN KEY (maker_id , product_id)
REFERENCES item(maker_id , product_id)
);
制約の名前を設定
CONSTRAINT <制約の名前> <制約>
制約の削除
ALTER TABLE <テーブル名> DROP CONSTRAINT <制約の名前>;
デフォルト値の設定
CREATE TABLE product
(
product_id INT NOT NULL PRIMARY KEY,
name CHAR(16) UNIQUE,
price INT DEFAULT 2000
);
インポート
以下に示すようなCSVファイルがあるとする。
"1001","2024-01-05 09:10:00","0" "1002","2024-02-04 10:05:00","1" "1003","2024-02-23 21:27:00","0"
CSVファイルと合致するようなテーブルがあるとする。
CREATE TABLE <テーブル名> (
ID INT,
F_DATE TIMESTAMP,
FLAG INT,
PRIMARY KEY(ID)
);
CSVファイルをテーブルにインポートする。
LOAD DATA LOCAL INLINE "<CSVファイルのパス>"
INTO TABLE <インポート先のテーブル名>
FIELDS TERMINATED by '<デリミタ>' -- CSVの場合は,(カンマ)を指定する