親テーブル、子テーブルを作成する
子テーブルに格納するのは値は親テーブルからのみとする設定
ネットショップに使えるそうだ 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) (もくたんでっさん)
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。