トリガーとは、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つ
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。