プライマリーキー(primary key)の設定されたカラム内のインデックスデータ番号の重複を禁止する機能を勉強しました。 free52

Saturday,July,6,2013

前回(auto_increment)は勝手にインデックスが付きました
  mysql> create table sadachika_books.sadachi_autotest(sada_id int auto_increment, sada_name varchar(10),         *カラム名sada_id INT型 auto_increment(関数みたいなもんでしょX+1), カラム名sada_name VARCHAR型          
      -> index(sada_id));

少し前ですが、ENUM型のカラムを持つテーブル、これもインデックスが付いていました。
  mysql> create table test4(col ENUM('one','two','three','four','five','red','blue','yellow','sadachika','ten','eleven','twelve','定近','twenty nine'));

今回勉強したのは、プライマリーキー(primary key)の設定されたカラム内のインデックスデータ番号の重複を禁止する機能です。
ユニークインデックスも同時に設定されと説明にあります?
よくかわからないですが、これのことかな?
  mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_gakunen = 1;
  mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_kumi = 'c';
一番下に補足しました。

○プライマリーキーの設定を施したデーブルを作成する。
           お手本CREATE TABLE db_name.tbl_name
                   (col_name1 data_type1 NOT NULL PRIMARY KEY, col_name2 data_type2, ...);

                    mysql> create table pritest(id int not null primary key, name varchar(10));

mysql> create table sadachika_books.sadachi_pritest(sada_id int not null primary key, sada_name varchar(10));           
                      ↑データベース名     ↑テーブル名
                                                      *↑カラム名sada_in INT型(おそらく数字のみ入力可能) not null(データ無し入力をさせない)を設定し  primary keyの設定を施しデータの重複入力を避ける      
                                                                                       *↑カラム名sada_name VARCHAR型(おそらく文字入力の型なんでしょうね)
○テーブルの構造を見る
mysql> show columns from sadachika_books.sadachi_pritest;            *columns(新聞など印刷物の)縦の段; 欄.                     
Field       Type         Null   Key    Default    Extra
sada_id     int(11)      NO     PRI    NULL                          *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_pritest\G

**************** 1.row **********************
        Table: sadachika_pritest
   Non_unique: 0
     Key_name:PRIMARY
 Seq_in_index:1
  Column_name:sada_id
    Collation:A
  Cardinality:0
     Sub_part:NULL
       Packed:NULL
         NULL:
   Index_Type:BTREE
      Comment:
Index_comment:

○データ入力
           お手本mysql> insert into autotest(name) values('扇風機');
                      お手本mysql> insert into autotest(id, name) values(1, '扇風機');
mysql> insert into sadachika_books.sadachi_pritest(sada_id) values('abc');                  *ERROR  INT型の文字入力をテストします。
mysql> insert into sadachika_books.sadachi_pritest(sada_name) values('abc');                *ERROR
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(1, 2013);
Query OK, 1 row affected (0.02 sec)
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values('abc', 1);    *ERROR
mysql> insert into sadachika_books.sadachi_pritest() values();
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(2, 広島);     *ERROR                    *シングルクォーテイション無しERROR
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(2, '広島');                       *シングルクォーテイションでくくる
Query OK, 1 row affected (0.02 sec)
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(3, '広島');                       *シングルクォーテイションでくくる
Query OK, 1 row affected (0.02 sec)
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(3, '広島');          *ERROR
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(3, '大阪');          *ERRORそりゃそうだよな、同じ3番にデータを入力できるわけ無いよな これがプライマリキーなの?
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(NULL, '大阪');       *ERROR   NULLも格納できない
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(4, '大阪');
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(5, 0705);
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(3, 2013年7月5日);    *ERROR
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(11, '2013年7月5日');
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(6, '2013年7月5日');
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(7, '広島');
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(8, '福山');
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(21, '定近');         *21番から先に入力してみる
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(22, '充始');
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(23, 'NULL');         *シングルで囲めば文字か?入力が許可された
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(24, NULL);           *sada_nameカラムにはNULLの入力が許可されている
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(9, 'さだちか');      *23番目から小さい数字に戻りました
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(10, 'さだちか');           
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(25, '');             *入力が許可された
mysql> insert into sadachika_books.sadachi_pritest(sada_id, sada_name) values(26, 'サダチカ');

○テーブルの中身の表示 
mysql> select * from sadachika_books.sadachi_pritest;
sada_id    sada_name
      1    2013
      2    広島
      3    広島
      4    大阪
      5    705
      6    2013年7月5日
      7    広島
      8    福山
      9    さだちか
     10    さだひか
     11    2013年7月5日
     21    定近
     22    定近
     23    NULL          *シングルで'NULL'を囲めば文字か?入力が許可された
     24    NULL          *sada_nameカラムにはNULLの入力が許可されている
     25                  *空白values(25, '')がシングル囲めば入力可能に
     26    サダチカ

○2項目のプライマリーキーを設定したテーブルを作る。
      お手本CREATE TABLE db_name.tbl_name
              (col_name1 data_type1 NOT NULL, col_name2 data_type2, ...,
              PRIMARY KEY(index_col_name1, index_col_name2, ...));

            mysql> create table pritest2(
                -> gakunen int not null, kumi varchar(10) not null, name varchar(20),
                -> primary key(gakunen, kumi));

mysql> create table sadachika_books.sadachi_pritest2(
    -> sada_gakunen int not null, sada_kumi varchar(10) not null, sada_name varchar(20),
    -> primary key(sada_gakunen, sada_kumi));

○テーブルの構造を見る
mysql> show columns from sadachika_books.sadachi_pritest2;            *columns(新聞など印刷物の)縦の段; 欄.                     
Field          Type         Null   Key    Default    Extra
sada_gakunen   int(11)      NO     PRI    NULL                          *Key項目がPRI カラム名sada_gakunen INT型(おそらく数字のみ入力可能)
sada_kumi      varchar(10)  NO     PRI    NULL                          *Key項目がPRI カラム名sada_kumi VARCHAR型 文字によるインデックスを作成するんだな、INT型が数字だけしか使用できないから
sada_name      varchar(10)  YES           NULL


○データ入力
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values('a', 'a', 'a');         *ERROR カラム名sada_gakunen INT型に文字データが入力できるかテストした
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(1, 'a', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(1, 'A', '定近');*ERROR
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(1, 'b', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(1, 'B', '定近');*ERROR
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(1, 'C', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(1, 'c', '定近');*ERROR
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(2, 'a', '定近');    
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(2, 'b', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(2, 'c', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'a', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'b', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'c', '定近');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(4, 'a', '定近'); 
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(4, 'b', '定近'); 
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(4, 'c', '定近');    

mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(2, 'b', '坂本'); *ERROR
insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(2, 'd', '坂本');
insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'A', '坂本');        *ERROR
insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(18, 'A', '坂本');
insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(18, 'a', '坂本');        *ERROR

○テーブルの中身の表示 
mysql> select * from sadachika_books.sadachi_pritest2;
sada_gakunen    sada_kumi   sada_name
           1    a           定近
           1    b           定近
           1    C           定近        *カラム名sada_kumi VARCHAR型 大文字小文字の区別がない。大文字Cで登録済みだから小文字cは使用できなかった。
           2    a           定近
           2    b           定近
           2    c           定近
           2    d           坂本        *a〜cまで登録済などでa〜cでの入力が出来ない。しかたなくdで入力した
           3    a           定近
           3    b           定近
           3    c           定近
           4    a           定近
           4    b           定近
           4    c           定近
          18    A           坂本

○対象のカラムの値を削除する
delete from sadachika_books.sadachi_pritest2 where (sada_gakunen, sada_kumi, sada_name) = (18, 'A', '坂本');
delete from sadachika_books.sadachi_pritest2 where (sada_gakunen, sada_kumi, sada_name) = (3, 'a', '定近');
delete from sadachika_books.sadachi_pritest2 where (sada_gakunen, sada_kumi, sada_name) = (3, 'b', '定近');
delete from sadachika_books.sadachi_pritest2 where (sada_gakunen, sada_kumi, sada_name) = (3, 'c', '定近');

○テーブルの中身の表示 
mysql> select * from sadachika_books.sadachi_pritest2;
sada_gakunen    sada_kumi   sada_name
           1    a           定近
           1    b           定近
           1    C           定近        *カラム名sada_kumi VARCHAR型 大文字小文字の区別がない。大文字Cで登録済みだから小文字cは使用できなかった。
           2    a           定近
           2    b           定近
           2    c           定近
           2    d           坂本        *a〜cまで登録済などでa〜cでの入力が出来ない。しかたなくdで入力した
                                        *削除された
           4    a           定近
           4    b           定近
           4    c           定近
                                        *削除された

○データ入力
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'A', 'ひらやま');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'B', 'ひらやま');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'C', 'ひらやま');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(18, 'a', '坂本');
mysql> insert into sadachika_books.sadachi_pritest2(sada_gakunen, sada_kumi, sada_name) values(3, 'a', '定近');    *ERROR

○テーブルの中身の表示 
mysql> select * from sadachika_books.sadachi_pritest2;
sada_gakunen    sada_kumi   sada_name
           1    a           定近
           1    b           定近
           1    C           定近        *カラム名sada_kumi VARCHAR型 大文字小文字の区別がない。大文字Cで登録済みだから小文字cは使用できなかった。
           2    a           定近
           2    b           定近
           2    c           定近
           2    d           坂本        *a〜cまで登録済などでa〜cでの入力が出来ない。しかたなくdで入力した
           3    A           ひらやま    *増えた
           3    B           ひらやま    *増えた
           3    C           ひらやま    *増えた
           4    a           定近
           4    b           定近
           4    c           定近
          18    a           坂本        *増えた                         


○○この項目初めてさわるかも。
 インデックスを確認。
mysql> show index from sadachika_books.sadachi_pritest2\G

**************** 1.row **********************
        Table: sadachika_pritest2
   Non_unique: 0
     Key_name:PRIMARY
 Seq_in_index:1
  Column_name:sada_gakunen   *カラム名
    Collation:A
  Cardinality:14             *たぶん14項目の入力だな
     Sub_part:NULL
       Packed:NULL
         NULL:
   Index_Type:BTREE
      Comment:
Index_comment:
**************** 2.row **********************
        Table: sadachika_pritest2
   Non_unique: 0
     Key_name:PRIMARY
 Seq_in_index:2
  Column_name:sada_kumi   *カラム名  
    Collation:A
  Cardinality:14          *たぶん14項目の入力だな
     Sub_part:NULL
       Packed:NULL
         NULL:
   Index_Type:BTREE
      Comment:
Index_comment:

ユニークインデックスってこのことでしょうか?
○テーブルの中身を検索?
         mysql> SELECT * FROM test4 WHERE col = 'one';
mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_gakunen = 1;
sada_gakunen      sada_kumi     sada_name
           1      a             定近
           1      b             定近
           1      c             定近

mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_gakunen = 2;
mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_gakunen = 3;
mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_gakunen = 4;

mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_kumi = 'a';
mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_kumi = 'b';
mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_kumi = 'c';
sada_gakunen      sada_kumi     sada_name
           1      C             定近
           2      c             定近
           2      C             ひらやま
           4      c             定近

mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_kumi = 'd';

○テーブルの中身の検索?
         mysql> select concat('(',col,')')from test4 where col=14;
mysql> select concat('(',sada_gakunen,')')from sadachika_books.sadachi_pritest2 where sada_gakunen = 1;
mysql> select concat('(',sada_kumi,')')from sadachika_books.sadachi_pritest2 where sada_kumi = 'c';
concat('(',sada_kumi,')
(C)
(c)
(C)
(c)

mysql> select concat('(',sada_name,')')from sadachika_books.sadachi_pritest2 where sada_name = 'ひらやま';



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

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

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