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