プライマリーキー(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 = 'ひらやま';
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。