トリガーとは、2つのテーブルの片方へデータの入力を行なうと、
もう片方のテーブルへ自動でデータを格納していく事ができる機能である。 free63

Thursday,July,11,2013

勉強している途中に、テーブル名とカラム名を変更する復習も行いました。


○テーブルを2つ作る。
mysql> create table sadachika_shop.sadachi_user(sada_id int, sada_name varchar(20));             *カラム名sada_id INT型,カラム名sada_name VARCHAR型

mysql> create table sadachika_shop.sadachi_log(sada_logtext varchar(20), sada_t timestamp);      *カラム名sada_logtext VARCHAR型,カラム名sada_t TIMESTAMP型

○これがポイントかな?(delimiter $$ の前に)
USE sadachika_shop;

mysql> delimiter $$               *プログラムの範囲を$で指定し、;←の機能を外部と遮断する
                      ↓トリガ名                              ↓db名         ↓テーブル名 
mysql> create trigger sadachika_triggerinsert after insert on sadachika_shop.sadachi_user for each row    *テーブル名sadachi_userでデータが追加されたらプログラム実行する。
    -> begin                                                                                              *データの入力が行なわれた後(after insert)、以下のテーブル名(sadachi_log)へ'INSERT'と入力する。 
    -> insert into sadachika_shop.sadachi_log(sada_logtext) values ('INSERT');                           *入力する, db名, テーブル名sadachi_log LOGTEXT型, カラム名sada_logtext, 入力の値(INSERT)
    -> end;          ↑db名         ↑テーブル名   ↑カラム名                                             *テーブル名sadachi_log のカラム名sada_t へは入力を行なわない。
    -> $$

mysql> delimiter ;                *プログラムの範囲を$で指定し、;←の機能を外部と遮断したが元に戻す


mysql> delimiter $$               *プログラムの範囲を$で指定し、;←の機能を外部と遮断する
                      ↓トリガ名                              ↓db名         ↓テーブル名
mysql> create trigger sadachika_triggerdelete after delete on sadachika_shop.sadachi_user for each row    *テーブル名sadachi_userでデータが削除されたらプログラム実行する。
    -> begin                                                                                              *データが削除された後(after delete)、以下のテーブル名(sadachi_log)へ'DELETE'と入力する。
    -> insert into sadachika_shop.sadachi_log (sada_logtext) values ('DELETE');                           *入力する, db名, テーブル名sadachi_log LOGTEXT型, カラム名sada_logtext, 入力の値(DELETE)
    -> end;          ↑db名         ↑テーブル名   ↑カラム名                                             *テーブル名sadachi_log のカラム名sada_t へは入力を行なわない。 
    -> $$

mysql> delimiter ;


○データをカラムに入力                        ↓省略してるね 全選択だと→*なども使っていたよね mysql> insert into sadachika_shop.sadachi_user * values(1, '定近'); 
mysql> insert into sadachika_shop.sadachi_user values(1, '定近');                        *これでも入力できるみたい
mysql> insert into sadachika_shop.sadachi_user(sada_id, sada_name) values(1, '定近');           
mysql> insert into sadachika_shop.sadachi_user(sada_id, sada_name) values(2, '平山');
mysql> insert into sadachika_shop.sadachi_user(sada_id, sada_name) values(3, '福山');  
mysql> insert into sadachika_shop.sadachi_user(sada_id, sada_name) values(4, '府中'); 
mysql> insert into sadachika_shop.sadachi_user(sada_id, sada_name) values(5, '広島'); 

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_user;
sada_id   sada_name
      1   定近
      2   平山
      3   福山
      4   府中
      5   広島

mysql> select * from sadachika_shop.sadachi_log;
sada_logtext   sada_t
INSERT         2013-07-11 22:22:12
INSERT         2013-07-11 22:22:24
INSERT         2013-07-11 22:22:33
INSERT         2013-07-11 22:22:43
INSERT         2013-07-11 22:22:53

_______________________
入力時にエラーが頻発したので、自信を喪失してしまった。
この負のイメージを振り払うためには、成功体験を積み上げていき、失敗の記憶を消さなければならない。

という理由から、テールブル名とカラム名の変更の仕方を復習しました。










_______________________
○テーブルを作る  テーブル名user, log
mysql> create table sadachika_shop.user(id int, name varchar(20));

mysql> create table sadachika_shop.log(logtext varchar(20), t timestamp);

○テーブルの構造を見る
mysql> show columns from sadachika_shop.user;
Field   Type         Null   Key    Default    Extra
id      int(11)      YES           NULL                    *Key項目が     カラム名id INT型(おそらく数字のみ入力可能)
name    varchar(20)  YES           NULL  

○テーブルの名前を変更する
mysql> alter table sadachika_shop.user rename to sadachika_shop.sadachi_triggertestuser;
mysql> alter table sadachika_shop.log rename to sadachika_shop.sadachi_triggertestlog;

○テーブルの構造を見る
mysql> show columns from sadachika_shop.user; ERROR
mysql> show columns from sadachika_shop.log; ERROR

mysql> show columns from sadachika_shop.sadachi_triggertestuser;
Field   Type         Null   Key    Default    Extra
id      int(11)      YES           NULL                    *Key項目が     カラム名id INT型(おそらく数字のみ入力可能)
name    varchar(20)  YES           NULL  

mysql> show columns from sadachika_shop.sadachi_triggertestlog;
Field   Type          Null   Key    Default             Extra
logtext varchar(20)   YES           NULL                                              *Key項目が     カラム名id INT型(おそらく数字のみ入力可能)
t       timestamp(20) NO            CURRENT_TIMESTAMP   on update CURRENT_TIMESTAMP 

○カラム名を変更する
カラム名id→sada_id                                                                           ↓重複を許さない(primary key)○○カラム名の変更、データ型の変更                                          ↓INT型 ↓データ無しを許さない     ↓not nullだから使われることはないかなぁテスト。
mysql> alter table sadachika_shop.sadachi_triggertestuser change id sada_id int not null primary key default '無記入ですBySada'; *名前だけ変更するのであってもあわせて型を入力する。
                                                       旧カラム名↑     ↑新しく変更するカラム名(hirayama_id)
  上記でERROR 1067 (42000): Invalid default value for 'sada_id'と表示された。
  そのため[default '無記入ですBySada']を取り払った

mysql> alter table sadachika_shop.sadachi_triggertestuser change id sada_id int not null primary key;
Query OK, 0 rows affected (0.00 sec) 影響を受けた
Records: 0 Duplicates: 0 Warnings: 0 記録する 重複の 戒めの言葉

カラム名name→sada_name
mysql> alter table sadachika_shop.sadachi_triggertestuser change name sada_name varchar not null;*ERROR
 not nullを削除してみる
mysql> alter table sadachika_shop.sadachi_triggertestuser change name sada_name varchar;*ERROR
(20)をつける
mysql> alter table sadachika_shop.sadachi_triggertestuser change name sada_name varchar(20);
Query OK, 0 rows affected (0.00 sec) 影響を受けた  *(20)が原因だったのか?
Records: 0 Duplicates: 0 Warnings: 0

○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_triggertestuser;
Field   Type         Null   Key    Default    Extra
id      int(11)      NO     PRI    NULL                    *Key項目が     カラム名id INT型 not null primary key
name    varchar(20)  YES           NULL  


○作成したテーブル(sadachi_triggertestlog)の定義を確認してみる
型がtimestampであるため、少しややこしそう、がんばる。
カラム名の変更はあわせて型を入力しなければならない。

mysql> show create table sadachika_shop.sadachi_triggertestlog\G
*********** 1. row **************
       Table: sadachi_triggertestlog
Create Table: CREATE TABLE 'sadachi_triggertestlog'(
 'logtext' varchar(20) DEFAULT NULL,                                           *カムラの名前logtext、varchar(20)型
 't' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  *カラム名t TIMESTAMP型 
) ENGINE=InnoDB DEFAULT CHARSET=utf8                                           *なんでDEFAULT があいだに?
1 row in set (0.61 sec)                                                        *デフォルトでcp932になるみたい 指定する場合は、文字セットと照合順序を指定してデータベース(フォルダ)を作成
                                                                               *例えば、こんな感じ、忘れないために書いておくmysql> create database sadachika_cp932db character set cp932; 

○カラム名の変更、データ型を入力する
カラム名logtext→sada_logtext
mysql> alter table sadachika_shop.sadachi_triggertestlog change logtext sada_logtext varchar(20); *名前だけ変更するのであってもあわせて型VARCHAR(20)を入力する。
カラム名t→sada_t
mysql> alter table sadachika_shop.sadachi_triggertestlog change t sada_t timestamp ;              *名前だけ変更するのであってもあわせて型TIMESTAMPを入力する。

○作成したテーブル(sadachi_triggertestlog)の定義を確認してみる
mysql> show create table sadachika_shop.sadachi_triggertestlog\G
*********** 1. row **************
       Table: sadachi_triggertestlog
Create Table: CREATE TABLE 'sadachi_triggertestlog'(
 'sada_logtext' varchar(20) DEFAULT NULL,                                                *カムラの名前logtext→sada_logtextへ 型はそのまま
 'sada_t' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP       *カムラの名前t→sada_tへ 型はそのまま 変更時timestamp型の後ろには何も付けなかったが、型は自動的にデフォルト値になったみたい。
) ENGINE=InnoDB DEFAULT CHARSET=utf8                                                     *なんでDEFAULT があいだに?
1 row in set (0.00 sec)  

USE sadachika_shop;
○テーブルを表示させる。
SHOW TABLES;
Tables_in_sadachika_shop
sadachi_triggertestlog   *変更され増えた
sadachi_triggertestuser  *変更され増えた

おさらい
sadachika_triggerinsert2*トリガ名
sadachika_triggerdelete2
mysql> alter table sadachika_shop.user rename to sadachika_shop.sadachi_triggertestuser;*テーブル名user→sadachi_triggertestuser
mysql> alter table sadachika_shop.log rename to sadachika_shop.sadachi_triggertestlog;
mysql> select * from sadachika_shop.sadachi_triggertestuser; *テーブル名
mysql> select * from sadachika_shop.sadachi_triggertestlog;

                                                    上のトリガ名とテーブル名
                                                    sadachika_triggerinsert*トリガ名
                                                    sadachika_triggerdelete
                                                    mysql> select * from sadachika_shop.sadachi_user; *テーブル名
                                                    mysql> select * from sadachika_shop.sadachi_log;
USE sadachika_shop;
mysql> delimiter $$

mysql> create trigger sadachika_triggerinsert2 after insert on sadachika_shop.sadachi_triggertestuser for each row
    -> begin
    -> insert into sadachika_shop.sadachi_triggertestlog (sada_logtext) values ('INSERT');
    -> end;
    -> $$

mysql> delimiter ;

mysql> delimiter $$

mysql> create trigger sadachika_triggerdelete2 after delete on sadachika_shop.sadachi_triggertestuser for each row
    -> begin
    -> insert into sadachika_shop.sadachi_triggertestlog (sada_logtext) values ('DELETE');
    -> end;
    -> $$

mysql> delimiter ;

○データをカラムに入力 
mysql> insert into sadachika_shop.sadachi_triggertestuser values(1, 'さだちか');
mysql> insert into sadachika_shop.sadachi_triggertestuser(sada_id, sada_name) values(1, 'さだちか');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'  
mysql> insert into sadachika_shop.sadachi_triggertestuser(sada_id, sada_name) values(2, 'ひらやま');
mysql> insert into sadachika_shop.sadachi_triggertestuser(sada_id, sada_name) values(3, 'ふくやま');  
mysql> insert into sadachika_shop.sadachi_triggertestuser(sada_id, sada_name) values(4, 'ふちゅう'); 
mysql> insert into sadachika_shop.sadachi_triggertestuser(sada_id, sada_name) values(5, 'ひろしま'); 


○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_triggertestuser;
sada_id   sada_name
      1   さだちか
      2   ひらやま
      3   ふくやま
      4   ふちゅう
      5   ひろしま

mysql> select * from sadachika_shop.sadachi_triggertestlog;
sada_logtext   sada_t
INSERT         2013-07-12 00:49:59
INSERT         2013-07-12 00:52:57
INSERT         2013-07-12 00:53:05
INSERT         2013-07-12 00:53:13
INSERT         2013-07-12 00:53:20

○カラムのデータを削除する
mysql> delete from sadachika_shop.sadachi_triggertestuser where sada_id >= 4;
mysql> delete from sadachika_shop.sadachi_triggertestuser where sada_id >= 5;

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_triggertestuser;
sada_id   sada_name
      1   さだちか
      2   ひらやま
      3   ふくやま
                   *削除された
                   *削除された

mysql> select * from sadachika_shop.sadachi_triggertestlog;
sada_logtext   sada_t
INSERT         2013-07-12 00:49:59
INSERT         2013-07-12 00:52:57
INSERT         2013-07-12 00:53:05
INSERT         2013-07-12 00:53:13
INSERT         2013-07-12 00:53:20
DELETE         2013-07-12 01:15:25
DELETE         2013-07-12 01:15:25  *2つ削除したが同じ25秒?

○カラムのデータを削除する
mysql> delete from sadachika_shop.sadachi_triggertestuser where sada_id >= 3;

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_triggertestuser;
sada_id   sada_name
      1   さだちか
      2   ひらやま
 
mysql> select * from sadachika_shop.sadachi_triggertestlog;
sada_logtext   sada_t
INSERT         2013-07-12 00:49:59
INSERT         2013-07-12 00:52:57
INSERT         2013-07-12 00:53:05
INSERT         2013-07-12 00:53:13
INSERT         2013-07-12 00:53:20
DELETE         2013-07-12 01:15:25
DELETE         2013-07-12 01:15:25  *2つ削除したが同じ25秒?
DELETE         2013-07-12 01:19:43

残すミッション3つ


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

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

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