テーブルにユニークキー(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 後藤
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。