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