テーブルにユニークキー(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           後藤


* 参考にしたサイトは→ こちら です。

これは赤色の文字例です。

これは青色の文字例です。