MySQLでは各レコードを一意に識別するためのカラムを設定するのが一般的です。このカラムを主キー(プライマリキー)として指定しておけば、値を入れ忘れたり、値が重複している時にエラーを返してくれるため便利です。
目次
主キー(PRIMARY KEY)の指定
実際にカラムを設定して主キーに指定してみましょう。
主キー用のカラムは id という名前で NULL ではない整数の連番にするのが一般的です。
id INT NOT NULL
カラムを主キーに指定するには
PRIMARY KEY (カラム名)
と記述します。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( id INT NOT NULL, author_id INT, post_title VARCHAR(50) UNIQUE, PRIMARY KEY (id) ); -- レコードを挿入 INSERT INTO titles (id, author_id, post_title) VALUES (1, 1, 'MySQLとは'), (2, 2, 'SQLとはなにか'), (3 ,1, 'DockerでMySQLを使う方法'); SELECT * FROM titles;
主キーはレコードを一意に識別するためのカラムなので、値が重複していては問題です。
実際に値を重複させてみましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( id INT NOT NULL, author_id INT, post_title VARCHAR(50) UNIQUE, PRIMARY KEY (id) ); -- レコードを挿入 INSERT INTO titles (id, author_id, post_title) VALUES (1, 1, 'MySQLとは'), (2, 2, 'SQLとはなにか'), (2 ,1, 'DockerでMySQLを使う方法'); SELECT * FROM titles;
このようにエラーを返してくれます。
主キーの値を自動連番にする(AUTO_INCREMENT)
主キーの値を自動的に連番で振るよう設定することもできます。
主キーのカラムに AUTO_INCREMENT を付けてあげましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( id INT NOT NULL AUTO_INCREMENT, author_id INT, post_title VARCHAR(50) UNIQUE, PRIMARY KEY (id) ); -- レコードを挿入 INSERT INTO titles (author_id, post_title) VALUES (1, 'MySQLとは'), (2, 'SQLとはなにか'), (1, 'DockerでMySQLを使う方法'); SELECT * FROM titles;
自動的に連番を振るようにしたので INSERT文では id の値を挿入しないようにします。
ちゃんと自動的に連番が振られていることが確認できます。