テーブルにユニークキー(unique)設定を施す
カラムにインデックス番号をつけて重複を許さない仕様
カラムインデックス番号にNULLを格納できるのが利点である。 free53
Saturday,July,6,2013
前回のプライマリーキー(primary key)は、カラムのインデックス数字にNULLが使用できなかった
お手本CREATE TABLE db_name.tbl_name
(col_name1 data_type1 UNIQUE, col_name2 data_type2, ...);
mysql> create table uniquetest(id int unique, name varchar(10));
mysql> create table sadachika_books.sadachi_uniquetest(sada_id int unique, sada_name varchar(10)); *INT型 VARCHAR型
○テーブルの構造を見る
mysql> show columns from sadachika_books.sadachi_uniquetest; *columns(新聞など印刷物の)縦の段; 欄.
Field Type Null Key Default Extra
sada_id int(11) YES UNI NULL *Key項目がUNI プライマリーキーのときはKey項目がPRIでした *忘れるのでメモ前回はExtra項目がauto_increment(インデックスの自動挿入)設定にてKey項目がMULだった カラム名sada_num INT型(おそらく数字のみ入力可能)
sada_name varchar(10) YES NULL *カラム名sada_name VARCHAR型
○この項目初めてさわるかも。
インデックスを確認。
mysql> show index from sadachika_books.sadachi_uniquetest\G
**************** 1.row **********************
Table: sadachi_uniquetest
Non_unique: 0
Key_name:sada_id *前回プライマリキーのときはPRIMARY
Seq_in_index:1
Column_name:sada_id *カラム名
Collation:A
Cardinality:0 *たぶん0項目の入力だな
Sub_part:NULL
Packed:NULL
NULL:YES *NULLの格納は可能
Index_Type:BTREE
Comment:
Index_comment:
○データ入力
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(1, 'Sadachika'); *ERROR INT型の文字入力をテストします。
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(2, 'Atsushi');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(NULL, 'Hiroshima'); *INT型の入力は数字なのだがNULLがは格納されたみたい
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(1, 'fukuyama'); *ERROR 1062 (23000):Duplicate entry '1' for key 'sada_id'
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(NULL, 'fukuyama');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(3, 'Hirayama');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(4, '定近');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(5, '定近');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(NULL, '定近');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(NULL, 'さだちか');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(NULL, '定近');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(NULL, 'サダチカ');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(6, '定近');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(7, 'Sadachika');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(5, 'すずき'); *ERROR 1062 (23000):Duplicate entry '1' for key 'sada_id'
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(10, 'すずき');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(12, 'すずき');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(14, 'すずき');
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(8, 'すずき'); *小さい数字に戻る
mysql> insert into sadachika_books.sadachi_uniquetest(sada_id, sada_name) values(11, 'すずき'); *小さい数字に戻る
○テーブルの中身の表示
mysql> select * from sadachika_books.sadachi_uniquetest;
sada_id sada_name
1 Sadachika
2 Atsushi
NULL Hiroshima *インデックスのデータ無しが格納できるのが、ユニークキーの特徴なのかもね
NULL fukuyama
3 Hirayama
4 定近
5 定近
NULL 定近
NULL さだちか
NULL 定近
NULL サダチカ
6 定近
7 Sadachika
10 すずき
12 すずき
14 すずき
8 すずき *小さい数字が後ろにきたね
11 すずき *小さい数字が後ろにきたね
○この項目初めてさわるかも。
インデックスを確認。
mysql> show index from sadachika_books.sadachi_uniquetest\G
**************** 1.row **********************
Table: sadachi_uniquetest
Non_unique: 0
Key_name:sada_id *前回プライマリキーのときはPRIMARY
Seq_in_index:1
Column_name:sada_id *カラム名
Collation:A
Cardinality:18 *たぶん18項目の入力だな(NULL込み)
Sub_part:NULL
Packed:NULL
NULL:YES *NULLの格納は可能
Index_Type:BTREE
Comment:
Index_comment:
○複数のカラムを対象にユニークキー制約を設定
お手本CREATE TABLE db_name.tbl_name
(col_name1 data_type1, col_name2 data_type2, ...,
UNIQUE(index_col_name1, index_col_name2, ...));
mysql> create table uniquetest2(
-> gakunen int, kumi varchar(10), name varchar(20),
-> unique(gakunen, kumi));
mysql> create table sadachika_books.sadachi_uniquetest2(
-> sada_gakunen int, sada_kumi varchar(10), sada_name varchar(20), *INT型 VARCHAR型 VARCHAR型
-> unique(sada_gakunen, sada_kumi));
○テーブルの構造を見る
mysql> show columns from sadachika_books.sadachi_uniquetest2; *columns(新聞など印刷物の)縦の段; 欄.
Field Type Null Key Default Extra
sada_gakunen int(11) YES MUL NULL *Key項目がMULなんで UNIだったのに?
sada_kumi varchar(10) YES NULL
sada_name varchar(10) YES NULL
○○この項目初めてさわるかも。
インデックスを確認。
mysql> show index from sadachika_books.sadachi_uniquetest2\G
**************** 1.row **********************
Table: sadachi_uniquetest2
Non_unique: 0
Key_name:sada_gakunen *前回プライマリキーのときはPRIMARY
Seq_in_index:1
Column_name:sada_gakunen *カラム名
Collation:A
Cardinality:0 *たぶん0項目の入力だな(NULL込み)
Sub_part:NULL
Packed:NULL
NULL:YES *NULLの格納は可能
Index_Type:BTREE
Comment:
Index_comment:
**************** 2.row **********************
Table: sadachi_uniquetest2
Non_unique: 0
Key_name:sada_gakunen *前回プライマリキーのときはPRIMARY
Seq_in_index:2
Column_name:sada_kumi *カラム名
Collation:A
Cardinality:0 *たぶん0項目の入力だな(NULL込み)
Sub_part:NULL
Packed:NULL
NULL:YES *NULLの格納は可能
Index_Type:BTREE
Comment:
Index_comment:
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(1, 'a', '定近');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(1, 'b', '吉谷');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(1, 'c', '山本');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(2, 'a', '平山');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(2, 'b', '福山');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(2, 'c', '福山');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(3, 'a', '福岡');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(1, 'a', '愛媛'); *ERROR 1062 (23000):Duplicate entry '1-a' for key 'sada_gakunen'
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(null, 'a', '愛媛');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(1, null, '愛媛');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(null, null, '愛媛');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(3, 'b', '橘高');
mysql> insert into sadachika_books.sadachi_uniquetest2(sada_gakunen, sada_kumi, sada_name) values(3, 'c', '後藤');
この例え、無理があるような 学校のクラスには25名くらいいるのにこの場合重複を許さないという。
他の設定でつつけるのかな?
○テーブルの中身の表示
mysql> select * from sadachika_books.sadachi_uniquetest2;
sada_gakunen sada_kumi sada_name
1 a 定近
1 b 吉谷
1 c 山本 *インデックスのデータ無しが格納できるのが、ユニークキーの特徴なのかもね
2 a 平山
2 b 福山
2 c 福山
3 a 福岡
NULL a 愛媛
1 NULL 愛媛
NULL NULL 愛媛
3 b 橘高
3 c 後藤
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。