質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

3049閲覧

MySQL トリガーについて

earnest_gay

総合スコア615

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2016/09/12 07:27

編集2016/09/12 07:47

MySQLトリガーについて

トリガーという機能を知らなくて使ってみると便利!
user1というテーブルで行った操作(INSERT/UPDATE/DELETE)を別テーブルにも丸々同じ動作で複製したい時に便利ですね。

それで、下記SQL文の場合だと
user1テーブルの1レコードだけを変更しても
user2テーブルのすべてのレコードが変更対象になってしまうのが問題です。

INSERT INTO user2 (`id`,`surname`,`name`) VALUES (new.id,new.surname,new.name)

WHERE id = old.id

と思いきや違うみたい。
どうすればよろしいでしょうか?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/12 07:42

あなたの書いたトリガー文はどこでしょうねぇ
guest

回答2

0

ベストアンサー

まぁ普通はまるきり同じ複製を作るなんて無駄なことはしませんね
ログをとったり正規化したテーブルの整合性をとったりします
とはいえ、単純にuser1の走査をuser2に適用するならこんな感じ

テーブル作成

SQL

1CREATE TABLE user1(id INT NOT NULL PRIMARY KEY,surname VARCHAR(30),name VARCHAR(30)); 2CREATE TABLE user2(id INT NOT NULL PRIMARY KEY,surname VARCHAR(30),name VARCHAR(30)); 3

トリガー作成

SQL

1DROP TRIGGER IF EXISTS TRG_USER_IN; 2DROP TRIGGER IF EXISTS TRG_USER_MOD; 3DROP TRIGGER IF EXISTS TRG_USER_DEL; 4DELIMITER // 5CREATE TRIGGER TRG_USER_IN AFTER INSERT ON user1 6FOR EACH ROW BEGIN 7INSERT INTO user2(id,surname,name) VALUES(new.id,new.surname,new.name); 8END; 9// 10CREATE TRIGGER TRG_USER_MOD AFTER UPDATE ON user1 11FOR EACH ROW BEGIN 12UPDATE user2 SET id=new.id,surname=new.surname,name=new.name 13WHERE id=old.id; 14END; 15// 16CREATE TRIGGER TRG_USER_DEL BEFORE DELETE ON user1 17FOR EACH ROW BEGIN 18DELETE FROM user2 WHERE id=old.id; 19END; 20// 21DELIMITER ; 22

テスト:user1の操作

SQL

1INSERT INTO user1 VALUES(1,'a','AAA'),(2,'b','BBB'),(3,'c','CCC'); 2UPDATE user1 SET NAME='XXX' WHERE id=1; 3UPDATE user1 SET id=10 WHERE id=2; 4DELETE FROM user1 WHERE id=3;

投稿2016/09/12 08:23

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

トリガで実行されるSQL文の中にwhere句を書いておかないとテーブルuser2の全件が対象になってしまいます。
トリガの定義のところを

SQL

1UPDATE user2 SET 2surname = new.surname, 3name = new.name, 4where id = old.id

とすれば期待通りの動作になるのではないでしょうか。

投稿2016/09/12 07:58

imutakaoru

総合スコア356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/09/12 13:41

上記の記述は全く同じものを試しましたが、エラーを吐いてしまいます。
imutakaoru

2016/09/12 23:37

あ。よけいなカンマがありました。失礼しました。 UPDATE user2 SET surname = new.surname, name = new.name where id = old.id new.nameの後ろのカンマを除去してもダメでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問