続トリガの練習
2つのテーブルの片方をアップデートするともう片方にも同じデータを格納させる free64

Friday,July,12,2013

USE sadachika_shop;

○テーブルを作る         ↓db名           ↓テーブル名
mysql> create table sadachika_shop.sadachi_art2013(sada_id int, sada_name varchar(20));       *データを入力 カラム名sada_id INT型, カラム名sada_name VARCHAR型

mysql> create table sadachika_shop.sadachi_art2013address(sada_name varchar(20), sada_pref varchar(20)); *トリガによりデータの格納を行なう *カラム名sada_name VARCHAR型, カラム名sada_pref VARCHAR型

○データを入力
mysql> insert into sadachika_shop.sadachi_art2013 values(1, '木炭デッサン');
mysql> insert into sadachika_shop.sadachi_art2013(sada_id, sada_name) values(2, '日本画');  
mysql> insert into sadachika_shop.sadachi_art2013(sada_id, sada_name) values(3, '油絵');
mysql> insert into sadachika_shop.sadachi_art2013address values('木炭デッサン', 'Hiroshima');
mysql> insert into sadachika_shop.sadachi_art2013address(sada_name, sada_pref) values('日本画', 'Kyoto');  
mysql> insert into sadachika_shop.sadachi_art2013address(sada_name, sada_pref) values('油絵', 'Osaka'); 

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_art2013;
sada_id   sada_name
1         木炭デッサン
2         日本画
3         油絵
mysql> select * from sadachika_shop.sadachi_art2013address;
sada_name      sada_pref  
木炭デッサン   Hiroshima
日本画         Kyoto
油絵           Osaka

○○UPDATEトリガ
mysql> delimiter $$
                         ↓トリガ名                                  ↓db名         ↓テーブル名
mysql> create trigger sadachika_triggerupdate201307 after update on sadachika_shop.sadachi_art2013 for each row
    -> begin    ↓db名          ↓テーブル名             ↓カラム名    ↓新しい                          ↓古い
    -> update sadachika_shop.sadachi_art2013address set sada_name = new.sada_name where sada_name = old.sada_name;
    -> end;
    -> $$

mysql> delimiter ;

○作成したトリガの一覧を取得する
SHOW TRIGGERS\G
sadachika_triggerupdate201307
○トリガを削除
DROP TRIGGER trigger_name;
mysql> drop trigger sadachika_triggerupdate201307;

○アップデートしてみます                                                            ↓古いデータ値
mysql> update sadachika_shop.sadachi_art2013 set sada_name = 'Kubo' where sada_name = 'Kudou';         ↓古いデータ値  *格納されていないデータのアップデートは無効
mysql> update sadachika_shop.sadachi_art2013 set sada_name = 'もくたんデッサン' where sada_name = '木炭デッサン';      *トリガは正常に働いた
                                                                ↑新しいデータ値
○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_art2013;
sada_id            sada_name
      1            もくたんデッサン       *アップデートしました
      2            日本画
      3            油絵

mysql> select * from sadachika_shop.sadachi_art2013address;
sada_name          sada_pref  
もくたんデッサン   Hiroshima              *トリガも無事に動きました  アップデートしました
日本画             Kyoto
油絵               Osaka

_________________________






__________________________

○作成したトリガの一覧を取得する  作成するにあたり、トリガ名が重複していないか確認する
mysql> USE sadachika_shop; 
SHOW TRIGGERS;
SHOW TRIGGERS\G

                             ↓2つあるうちデータを入力するテーブル名                                    ↓db名         ↓テーブル名
SHOW TRIGGERS LIKE 'sadachi_triggertestuser'\G   *データを書き込む方のテーブル名だと表示される(sadachika_shop.sadachi_triggertestuser)

SHOW TRIGGERS LIKE 'sadachi_triggertestlog'\G    *プログラムによる自動追記のテーブル名は表示されない(sadachika_shop.sadachi_triggertestlog)
                                                                                   ↓db名         ↓テーブル名
show triggers like 'sadachi_user'\G *データを書き込む方のテーブル名だと表示される(sadachika_shop.sadachi_user)
show triggers like 'sadachi_log'\G

○特定のデータベース内のテーブル  作成するにあたり、テーブル名が重複していないか確認する
SHOW TABLES FROM sadachika_shop;
○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_user;
------------------------------------------------------------------------------
○現在接続されているデーターベース
MySQL> select database();
database();
sadachika_shop ←接続されている

○テーブルを作る         ↓db名           ↓テーブル名
mysql> create table sadachika_shop.sadachi_triggeruser(sada_id int, sada_name varchar(20));       *データを入力 カラム名sada_id INT型, カラム名sada_name VARCHAR型

mysql> create table sadachika_shop.sadachi_address(sada_name varchar(20), sada_pref varchar(20)); *トリガによりデータの格納を行なう *カラム名sada_name VARCHAR型, カラム名sada_pref VARCHAR型

カラムをプライマリーキー設定にしたい
○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_triggeruser;
Field          Type         Null   Key    Default     Extra
sada_id        int(11)      YES           NULL                  *Key項目を変更する 
sada_name      varchar(20)  YES           NULL

○○カラム定義だけを変更する
mysql> alter table sadachika_shop.sadachi_triggeruser modify sada_id int primary key default'データがありません'; *ERROR *ついでにデフォルトも設定する
                                                              ↑対象のカラム ↑*後続に変更したい型を入力する  {INT型 primary key(重複データを許さない) default(無記入時に警告文を表示)}

mysql> alter table sadachika_shop.sadachi_triggeruser modify sada_id int primary key; *デフォルトを取って再度挑戦

○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_triggeruser;
Field          Type         Null   Key    Default     Extra
sada_id        int(11)      NO     PRI    NULL                  *Key項目を変更する 
sada_name      varchar(20)  YES           NULL

○○カラム定義だけを変更する
mysql> alter table sadachika_shop.sadachi_triggeruser modify sada_name varchar(20) default'データがありません'; *デフォルトNULL→データがありません

○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_triggeruser;
Field          Type         Null   Key    Default            Extra
sada_id        int(11)      NO     PRI    NULL                   
sada_name      varchar(20)  YES           データがありません    *Default項目が変更された

○テーブルの構造を見る(sadachi_address)
mysql> show columns from sadachika_shop.sadachi_address;
Field          Type         Null   Key    Default   Extra
sada_name      varchar(20)  YES           NULL                   
sada_pref      varchar(20)  YES           NULL    

○○カラム定義だけを変更する(sadachi_address)
mysql> alter table sadachika_shop.sadachi_address modify sada_name varchar(20) default'データがありません'; 
                                                            ↑変更したいカラムの名前  後続に型を記入していく
○テーブルの構造を見る(sadachi_address)
mysql> show columns from sadachika_shop.sadachi_address;
Field          Type         Null   Key    Default            Extra
sada_name      varchar(20)  YES           データがありません        *Default項目が変更された                   
sada_pref      varchar(20)  YES           NULL

○データをカラムに入力(sadachi_triggeruser) 
mysql> insert into sadachika_shop.sadachi_triggeruser values(1, 'Sadachika'); *全カラムを選択する省略文
mysql> insert into sadachika_shop.sadachi_triggeruser(sada_id) values(2);     *データがありませんをテスト
mysql> insert into sadachika_shop.sadachi_triggeruser(sada_id, sada_name) values(3, 'Atsushi');
mysql> insert into sadachika_shop.sadachi_triggeruser(sada_id, sada_name) values(4, 'Sakamoto');  
mysql> insert into sadachika_shop.sadachi_triggeruser(sada_id, sada_name) values(5, 'Takeda'); 
mysql> insert into sadachika_shop.sadachi_triggeruser(sada_id, sada_name) values(6, 'Hayashi'); 

○データをカラムに入力(sadachi_address)
mysql> insert into sadachika_shop.sadachi_address values('sadachika', 'Hiroshima'); *全カラムを選択する省略文
mysql> insert into sadachika_shop.sadachi_address(sada_pref) values('Japan');       *データがありませんをテスト
mysql> insert into sadachika_shop.sadachi_address(sada_name, sada_pref) values('Atsushi', 'Hiroshima');
mysql> insert into sadachika_shop.sadachi_address(sada_name, sada_pref) values('Sakamoto', 'Kyoto');  
mysql> insert into sadachika_shop.sadachi_address(sada_name, sada_pref) values('Takeda', 'Osaka'); 
mysql> insert into sadachika_shop.sadachi_address(sada_name, sada_pref) values('Hayashi', 'Hokkaido'); 
mysql> insert into sadachika_shop.sadachi_address(sada_name, sada_pref) values('Goto', 'Fuchu'); 

○テーブルの中身の表示 (sadachi_triggeruser)
mysql> select * from sadachika_shop.sadachi_triggeruser;
sada_id    sada_name
      1    Sadachika
      2    データがありません
      3    Atsushi
      4    Sakamoto
      5    Takeda
      6    Hayashi
      1    Sadachika
      2    データがありません
      3    Atsushi
      4    Sakamoto
      5    Takeda
      6    Hayashi

○テーブルの中身の表示 (sadachi_address)
mysql> select * from sadachika_shop.sadachi_address;
sada_name            sada_pref                   *sadachikaは頭が小文字
sadachika            Hiroshima
データがありません   Japan
Atsushi              Hiroshima
Sakamoto             Kyoto 
Takeda               Osaka
Hayashi              Hokkaido
Goto                 Fuchu
sadachika            Hiroshima
データがありません   Japan
Atsushi              Hiroshima
Sakamoto             Kyoto 
Takeda               Osaka
Hayashi              Hokkaido
Goto                 Fuchu

○○○UPDATEトリガ
mysql> delimiter $$
                         ↓トリガ名                            ↓db名         ↓テーブル名
mysql> create trigger sadachika_triggerupdate after update on sadachika_shop.sadachi_triggeruser for each row
    -> begin    ↓db名          ↓テーブル名     ↓カラム名    ↓新しい                          ↓古い
    -> update sadachika_shop.sadachi_address set sada_name = new.sada_name where sada_name = old.sada_name;
    -> end;
    -> $$

mysql> delimiter ;

○○アップデート
                     ↓db名          ↓テーブル名     ↓カラム名    ↓更新するデータ        ↓古いデータ
mysql> update sadachika_shop.sadachi_triggeruser set sada_name = '定近' where sada_name = 'Sadachika';
Query OK, 2 row affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> update sadachika_shop.sadachi_triggeruser set sada_name = '充始' where sada_name = 'データがありません';
Query OK, 2 row affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> update sadachika_shop.sadachi_triggeruser set sada_name = '平山' where sada_name = 'Atsushi';
Query OK, 2 row affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> update sadachika_shop.sadachi_triggeruser set sada_name = '坂本' where sada_name = 'Sakamoto';
Query OK, 2 row affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> update sadachika_shop.sadachi_triggeruser set sada_name = '武田' where sada_name = 'Takeda';
Query OK, 2 row affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> update sadachika_shop.sadachi_triggeruser set sada_name = '林' where sada_name = 'Hayashi';
Query OK, 2 row affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> insert into sadachika_shop.sadachi_triggeruser(sada_id, sada_name) values(7, 'Suzuki');         *トリガは働かない*sadachi_triggeruser→sadachi_addressへ上書きできるかテスト
mysql> insert into sadachika_shop.sadachi_triggeruser(sada_id, sada_name) values(8, 'Yamazaki');       *トリガは働かない*sadachi_triggeruser→sadachi_addressへ追記できるかテスト
mysql> update sadachika_shop.sadachi_triggeruser set sada_name = '鈴木' where sada_name = 'Suzuki';    *トリガは働かない
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

○テーブルの中身の表示 (sadachi_triggeruser)
mysql> select * from sadachika_shop.sadachi_triggeruser;
sada_id    sada_name
      1    定近        *アップデート完了
      2    充始        *アップデート完了
      3    平山        *アップデート完了
      4    坂本        *アップデート完了
      5    武田        *アップデート完了
      6    林          *アップデート完了
      1    定近        *アップデート完了
      2    充始        *アップデート完了
      3    平山        *アップデート完了
      4    坂本        *アップデート完了
      5    武田        *アップデート完了
      6    林          *アップデート完了
      7    鈴木        *アップデート完了 ただトリガは働きません
      8    Yamazaki

○テーブルの中身の表示 (sadachi_address)
mysql> select * from sadachika_shop.sadachi_address;
sada_name       sada_pref                   
定近            Hiroshima          *トリガ正常に働きました*sadachikaは頭が小文字→定近 where sada_name = 'Sadachika';
充始            Japan              *トリガ正常に働きました
平山            Hiroshima          *トリガ正常に働きました
坂本            Kyoto              *トリガ正常に働きました
武田            Osaka              *トリガ正常に働きました
林              Hokkaido           *トリガ正常に働きました
Goto            Fuchu
定近            Hiroshima          *トリガ正常に働きました
充始            Japan              *トリガ正常に働きました
平山            Hiroshima          *トリガ正常に働きました
坂本            Kyoto              *トリガ正常に働きました
武田            Osaka              *トリガ正常に働きました
林              Hokkaido           *トリガ正常に働きました
Goto            Fuchu

___
記入ミスでことごとくエラーがでたため、もしかしたらプレイマリキーが問題ではと考えて、キーを削除することにした。
結局はトリガーのプログラム記入に問題があったんだけど。
もったいないので残しておきます。

○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_triggeruser;
Field          Type         Null   Key    Default            Extra
sada_id        int(11)      NO     PRI    NULL                   
sada_name      varchar(20)  YES           データがありません        *Default項目が変更された

○○カラム定義だけを変更する(sadachi_address)
mysql> alter table sadachika_shop.sadachi_triggeruser modify sada_id int; 
                                                             ↑カラムの名前の後続に型を記入していく
変わらない
mysql> alter table sadachika_shop.sadachi_triggeruser modify sada_id varchar(20) default'データがありません'; 
                                                             ↑カラムの名前の後続に型を記入していく
primary keyが変わらない
mysql> alter table sadachika_shop.sadachi_triggeruser modify sada_id int null; 
                                                             ↑カラムの名前の後続に型を記入していく
○○主キーを削除する
mysql> alter table sadachika_shop.sadachi_triggeruser DROP PRIMARY KEY; 

mysql> alter table sadachika_shop.sadachi_triggeruser modify sada_id int null; 
                                                             ↑カラムの名前の後続に型を記入していく
○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_triggeruser;
Field          Type         Null   Key    Default            Extra
sada_id        int(11)      YES         NULL                      *やっと元にもどった
sada_name      varchar(20)  YES           データがありません   



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

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

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