親テーブル、子テーブルを作成する
子テーブルに格納するのは値は親テーブルからのみとする設定
ネットショップに使えるそうだ free56

-> on update restrict *RESTRICT 親テーブルの値をアップデートできない設定、何も設定しなければ標準でRESTRICT
-> on delete no action *NO ACTION 親テーブルの値をアップデートできない設定
-> on update cascade on delete cascade *CASCADE 親のアップデート削除を子で同期する設定
-> on update set null on delete set null *SET NULL 親のアップデートにより、子テーブルのデータはNULLとなる同期設定

Sunday,July,7,2013

     CREATE TABLE 親テーブル名(親カラム名 データ型) ENGINE=InnoDB;

     CREATE TABLE 子テーブル名(子カラム名 データ型,
       FOREIGN KEY (子カラム名)
       REFERENCES 親テーブル名(親カラム名)
       ) ENGINE=InnoDB;

○親テーブルを作成する
mysql> create table sadachika_shop.sadachi_goods(                              *データベース名sadachika_shop  テーブル名sadachi_goods
    -> sada_id int, sada_name varchar(10), index(sada_name)                    *カラム名sada_id INT型  カラム名sada_name VARCHAR型  indexというのは→(sada_name)にインデックス付与する設定
    -> ) engine=InnoDB;                                                        *親子テーブルで参照する場合はこの型を設定するとのことである

○子テーブルを作成する
mysql> create table sadachika_shop.sadachi_sales(                               *データベース名sadachika_shop  テーブル名sadachi_goods
    -> sada_id int, sada_name varchar(10), sada_d date, index(sada_name),       *カラム名sada_id INT型  カラム名sada_name VARCHAR型  カラム名sada_d DATE型  indexというのは→(sada_name)にインデックス付与する設定
    -> foreign key(sada_name) references sadachi_goods(sada_name)               *子テーブルのカラム名sada_nameを参照する  親テーブルのカラム名sada_nameに入力する
    -> ) engine=InnoDB;                                                        *親子テーブルで参照する場合はこの型を設定するとのことである

○サクラエディタでデータベースsadachika_shop内のdb.optファイルを開いてみた
default-character-set=utf8 
default-collation=utf8_general_ci

○データベースsadachika_shop内のファイルは合計4つ作成された
sadachi_goods.frm           *作成された
sadachi_goods.ibd           *作成された
sadachi_indextest.frm
sadachi_indextest.ibd
sadachi_sales.frm           *作成された
sadachi_sales.ibd           *作成された

○テーブル一覧
SHOW TABLES FROM sadachika_shop;
Tables_in_sadachika_shop
sadachi_goods               *作成された
sadachi_indextest
sadachi_sales               *作成された

○データベースを表示させる。
MySQL> show databases;

○現在接続されているデーターベース
MySQL> select database();
database()
NULL                               *どこのデータベースにも接続していない状況
mysql> USE sadachika_shop;         *データベースを指定する
mysql> \u sadachika_shop           *省略文 データベースを指定する

○テーブルの詳細情報を取得する
mysql> show table status\G

**************** 1.row **********************
           Name: sadachi_goods
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 16384
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2013-07-07 11:53:37
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
**************** 3.row **********************
           Name: sadachi_sales
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 16384
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2013-07-07 11:56:17
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:

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

mysql> show columns from sadachika_shop.sadachi_sales;                  *columns(新聞など印刷物の)縦の段; 欄.                     
Field         Type         Null    Key    Default    Extra
sada_id       int(11)      YES            NULL                          *Key項目が     カラム名sada_id   INT型(おそらく数字のみ入力可能)
sada_name     varchar(10)  YES     MUL    NULL                          *Key項目がMUL  カラム名sada_name VARCHAR型 文字によるインデックスを作成するんだな、INT型が数字だけしか使用できないから
sada_d        date         YES            NULL                          *Key項目が     カラム名sada_d    DATE型 日付専用か

○データ入力(親テーブル)
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(1, '鉛筆デッサン');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(2, '木炭デッサン');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(3, '日本画');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(4, '油絵');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(5, 'アクリル画');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(6, '版画');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(7, '七宝');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(8, '陶芸');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(8, '彫刻');
mysql> insert into sadachika_shop.sadachi_goods(sada_id, sada_name) values(2, 'クロッキー');*入力できちゃった、こまったな

○テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_goods;
sada_id    sada_name
      1    鉛筆デッサン
      2    木炭デッサン
      3    日本画
      4    油絵
      5    アクリル画
      6    版画
      7    七宝
      8    陶芸
      8    彫刻           *番号が重複してしまった  プライマリーキー(primary key)のインデックス数字の重複を許さない設定を入れればよかったね
      2    クロッキー     *番号が重複してしまった

○データ入力(子テーブル)
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(4, '油絵', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(1, 'ねんど', '13-07-07');*ERROR 親カラムに格納されていないためエラー
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(9, 'ねんど', '13-07-07');*ERROR 親カラムに格納されていないためエラー
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(1, '鉛筆デッサン', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(7, '七宝', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(3, '日本画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(3, '日本画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(2, '木炭デッサン', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(2, 'クロッキー', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(2, '日本画', '13-07-07');*数字が親と違うんだけど入力出来た
mysql> insert into sadachika_shop.sadachi_sales(sada_id, sada_name, sada_d) values(2, '油絵', '13-07-07');*数字が親と違うんだけど入力出来た

○テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_sales;
sada_id  sada_name      sada_d
      4  油絵           2013-07-07
      1  鉛筆デッサン   2013-07-07
      7  七宝           2013-07-07
      3  日本画         2013-07-07
      3  日本画         2013-07-07     *重複OKなんですね
      2  木炭デッサン   2013-07-07
      2  クロッキー     2013-07-07
      2  日本画         2013-07-07     *本来3入力出来た
      2  油絵           2013-07-07     *本来4入力出来た

○子テーブルを作成する(親子のアップデート削除の同期設定)
mysql> create table sadachika_shop.sadachi_sales3(                              *データベース名sadachika_shop  テーブル名sadachi_goods
    -> sada_id int, sada_name varchar(10), sada_d date, index(sada_name),       *カラム名sada_id INT型  カラム名sada_name VARCHAR型  カラム名sada_d DATE型  indexというのは→(sada_name)にインデックス付与する設定
    -> foreign key(sada_name) references sadachi_goods(sada_name)               *子テーブルのカラム名sada_nameを参照する  親テーブルのカラム名sada_nameに入力する
    -> on update cascade on delete cascade                                      *CASCADE  親子のアップデート削除の同期設定
    -> ) engine=InnoDB;                                                         *親子テーブルで参照する場合はこの型を設定するとのことである

○データ入力(子テーブル)
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(1, '鉛筆デッサン', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(2, '木炭デッサン', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(3, '日本画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(4, '王将', '13-07-07');       *ERROR 親カラムに格納されていないためエラー
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(4, '油絵', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(5, 'アクリル画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(6, '版画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales3(sada_id, sada_name, sada_d) values(7, '七宝', '13-07-07');

○テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_sales3;
sada_id  sada_name      sada_d
      1  鉛筆デッサン   2013-07-07
      2  木炭デッサン   2013-07-07
      3  日本画         2013-07-07
      4  油絵           2013-07-07
      5  アクリル画     2013-07-07
      6  版画           2013-07-07
      7  七宝           2013-07-07

○アップデート 親子のカラムデータ同期
update sadachika_shop.sadachi_goods set sada_name = 'えんぴつデザッサン' where sada_id = 1;


○テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_goods;
sada_id  sada_name        sada_d
      1  えんぴつデッサン 2013-07-07
      2  木炭デッサン     2013-07-07
      3  日本画           2013-07-07
      4  油絵             2013-07-07
      5  アクリル画       2013-07-07
      6  版画             2013-07-07
      7  七宝             2013-07-07

○テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_sales3;
sada_id  sada_name        sada_d
      1  えんぴつデッサン 2013-07-07
      2  木炭デッサン     2013-07-07
      3  日本画           2013-07-07
      4  油絵             2013-07-07
      5  アクリル画       2013-07-07
      6  版画             2013-07-07
      7  七宝             2013-07-07

○アップデート 親子のカラムデータ同期
update sadachika_shop.sadachi_goods set sada_name = '鉛筆デッサン' where sada_id = 1;

○テーブルの削除場合はこんな感じ
mysql> drop table sadachika_shop.sadachi_sales;

親テーブルに対して更新や削除を行うとエラーが発生します。RESTRICTはN DELETE句やON UPDATE句を明示的に指定しなかった場合に設定される値です。

○子テーブルを作成する(親子のアップデート削除の同期設定)
mysql> create table sadachika_shop.sadachi_sales3(                              *データベース名sadachika_shop  テーブル名sadachi_goods
    -> sada_id int, sada_name varchar(10), sada_d date, index(sada_name),       *カラム名sada_id INT型  カラム名sada_name VARCHAR型  カラム名sada_d DATE型  indexというのは→(sada_name)にインデックス付与する設定
    -> foreign key(sada_name) references sadachi_goods(sada_name)               *子テーブルのカラム名sada_nameを参照する  親テーブルのカラム名sada_nameに入力する
    -> on update restrict                                                       *RESTRICT  アップデートできない、何も設定しなければ標準でRESTRICT
    -> ) engine=InnoDB;                                                         *親子テーブルで参照する場合はこの型を設定するとのことである

○子テーブルを作成する(親子のアップデート削除の同期設定)
mysql> create table sadachika_shop.sadachi_sales3(                              *データベース名sadachika_shop  テーブル名sadachi_goods
    -> sada_id int, sada_name varchar(10), sada_d date, index(sada_name),       *カラム名sada_id INT型  カラム名sada_name VARCHAR型  カラム名sada_d DATE型  indexというのは→(sada_name)にインデックス付与する設定
    -> foreign key(sada_name) references sadachi_goods(sada_name)               *子テーブルのカラム名sada_nameを参照する  親テーブルのカラム名sada_nameに入力する
    -> on delete no action                                                      *NO ACTION  アップデートできない、何も設定しなければ標準でRESTRICT
    -> ) engine=InnoDB;                                                         *親子テーブルで参照する場合はこの型を設定するとのことである

○子テーブルを作成する(親子のアップデート削除の同期設定)
mysql> create table sadachika_shop.sadachi_sales4(                              *データベース名sadachika_shop  テーブル名sadachi_goods
    -> sada_id int, sada_name varchar(10), sada_d date, index(sada_name),       *カラム名sada_id INT型  カラム名sada_name VARCHAR型 カラム名sada_d DATE型  indexというのは→(sada_name)にインデックス付与する設定
    -> foreign key(sada_name) references sadachi_goods(sada_name)               *子テーブルのカラム名sada_nameを参照する  親テーブルのカラム名sada_nameに入力する
    -> on update set null on delete set null                                    *SET NULL  親のアップデートにより、子テーブルのデータはNULLとなる同期設定
    -> ) engine=InnoDB;                                                         *親子テーブルで参照する場合はこの型を設定するとのことである

○データ入力(子テーブル)
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(1, '鉛筆デッサン', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(2, '木炭デッサン', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(3, '日本画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(4, '王将', '13-07-07');      *ERROR 親カラムに格納されていないためエラー
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(4, '油絵', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(5, 'アクリル画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(6, '版画', '13-07-07');
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(7, '七宝', '13-07-07');

○子テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_sales4;
sada_id  sada_name        sada_d
      1  鉛筆デッサン     2013-07-07
      2  木炭デッサン     2013-07-07
      3  日本画           2013-07-07
      4  油絵             2013-07-07
      5  アクリル画       2013-07-07
      6  版画             2013-07-07
      7  七宝             2013-07-07

○○アップデート 親子のカラムデータ同期
update sadachika_shop.sadachi_goods set sada_name = 'えんぴつでっさん' where sada_id = 1;
update sadachika_shop.sadachi_goods set sada_name = 'もくたんでっさん' where sada_id = 2;
update sadachika_shop.sadachi_goods set sada_name = 'にほんが' where sada_id = 3;

○親テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_goods;
sada_id  sada_name        sada_d
      1  えんぴつでっさん 2013-07-07        *アップデートされたね
      2  もくたんでっさん 2013-07-07        *アップデートされたね  しかも2項目  sada_id  が重複してたからね
      3  にほんが         2013-07-07        *アップデートされたね
      4  油絵             2013-07-07
      5  アクリル画       2013-07-07
      6  版画             2013-07-07
      7  七宝             2013-07-07
      8  陶芸             2013-07-07
      8  彫刻             2013-07-07
      2  もくたんでっさん 2013-07-07        *アップデートされたね  しかも2項目  sada_id  が重複してたからね

○子テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_sales4;
sada_id  sada_name        sada_d
      1  NULL             2013-07-07       *親カラムデータを変更したため(on update set null on delete set null )
      2  NULL             2013-07-07       *親カラムデータを変更したため(on update set null on delete set null )
      3  NULL             2013-07-07       *親カラムデータを変更したため(on update set null on delete set null )
      4  油絵             2013-07-07
      5  アクリル画       2013-07-07
      6  版画             2013-07-07
      7  七宝             2013-07-07
      8  陶芸             2013-07-07
      8  彫刻             2013-07-07
      2  もくたんでっさん 2013-07-07









○sada_nameにインデックスが設定されているか、いろいろ試したが設定されていないぽいです。
結局はsada_idに関連付けられている感じです。
以下はその試行錯誤

○テーブルの内を検索
    mysql> SELECT * FROM sadachika_books.sadachi_pritest2 WHERE sada_kumi = 'c';
mysql> SELECT * FROM sadachika_shop.sadachi_goods WHERE sada_id = 8;
sada_id sada_name
      8 陶芸
      8 彫刻

mysql> SELECT * FROM sadachika_shop.sadachi_goods WHERE sada_id = 2;
sada_id sada_name
      2 もくたんでっさん
      2 もくたんでっさん

mysql> SELECT * FROM sadachika_shop.sadachi_goods WHERE sada_id = 3;
sada_id sada_name
      3 にほんが

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_goods;
sada_id sada_name
      1  えんぴつでっさん 
      2  もくたんでっさん 
      3  にほんが         
      4  油絵             
      5  アクリル画       
      6  版画             
      7  七宝             
      8  陶芸             
      8  彫刻            
      2  もくたんでっさん

○テーブルの中身を表示
mysql> SELECT * FROM sadachika_shop.sadachi_goods WHERE sada_name = 9;
Empty set, 10 warnings (0,03 sec)

○入力
mysql> insert into sadachika_shop.sadachi_sales4(sada_id, sada_name, sada_d) values(7, 7, '13-07-07');  *ERROR

○テーブルの中身を表示
mysql> SELECT * FROM sadachika_shop.sadachi_goods WHERE index = 9;   *ERROR

○テーブルの中身を表示
mysql> SELECT * FROM sadachika_shop.sadachi_goods WHERE index = 8;   *ERROR

○テーブルの中身を表示
mysql> select concat('(',sada_id,')')from sadachika_shop.sadachi_goods where sada_id = 2;
concat('(',sada_id,')')
(2)
(2)

○テーブルの中身を検索
mysql> select concat('(',sada_name,')')from sadachika_shop.sadachi_goods where sada_name = 2;
Empty set, 10 warnings (0,00 sec)

mysql> select concat('(',sada_name,')')from sadachika_shop.sadachi_goods where sada_name = '油絵';
concat('(',sada_name,')')
(油絵)

○テーブルの中身を表示
mysql> select concat('(',sada_id,')'), concat('(',sada_name,')')from sadachika_shop.sadachi_goods;
concat('(',sada_id,')')    concat('(',sada_name,')')
      (1)  (えんぴつでっさん) 
      (2)  (もくたんでっさん) 
      (3)  (にほんが)         
      (4)  (油絵)             
      (5)  (アクリル画)       
      (6)  (版画)             
      (7)  (七宝)             
      (8)  (陶芸)             
      (8)  (彫刻)            
      (2)  (もくたんでっさん)



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

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

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