構造的には同じですが時間の経過とともに変化する数多くのデータベースがあります。特定のテーブル(すべてのDBS)のデータは、中央データベース(db_central)の1つの中央テーブル( 'ex_objects')にコピーする必要があります(pkの競合はありません)。私はこの目的のために各DBにトリガーを使用しました。しかし、テーブル構造はほぼ毎日変化しているので、トリガーのクエリのON DUPLICATE KEY部分のフィールドを更新するのは苦労です。そして、誰かがテーブル構造を変更した後にトリガーを修正するのを忘れるかもしれません。だから私は、その特定の部分を動的に構築するための可能な解決策を見つけました。これは実際にスクリプト(PHP)ベースで動作しますが、私はトリガーを完了させることはありません。私はここで紛れているものは見ません。トリガーのON DUPLICATE KEYに動的なフィールド名を持つ変数を使用する方法(MariaDB/MySQL)
BEGIN
DECLARE VAL_FIELDS TEXT;
SET VAL_FIELDS = (SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_central' AND TABLE_NAME = 'ex_objects');
-- SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") INTO VAL_FIELDS FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_central' AND TABLE_NAME = 'ex_objects';
-- SELECT @VAL_FIELDS := GROUP_CONCAT(CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") INTO VAL_FIELDS FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_central' AND TABLE_NAME = 'ex_objects';
IF NEW.online = 1 THEN
INSERT INTO db_central.ex_objects
SELECT * FROM ex_objects WHERE id = NEW.id AND client_id = NEW.client_id AND NEW.online = 1
ON DUPLICATE KEY UPDATE VAL_FIELDS;
END IF;
END
私は; END IF; END
で何か問題があることをエラーが発生します。つまり、KEY UPDATE
の後の変数VAL_FIELDS
がまったく認識されないか、少なくとも1つの式(何かがVAL_FIELDS = whatever
のようなもの)が必要であることがわかります。しかし、この場合、根本的な問題はまったく解決できません。
SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME,"=v ... FROM INFORMATION_SCHEMA.C ...
クエリはうまく動作し、id=values(id), xfield=values(xfield), yfield=values(yfield)
と似たような結果になります(ただし、テーブルは実際にはかなり大きいので、数百フィールドあります)。
完全なエラー:SQLエラー(1064):SQL構文にエラーがあります。あなたのMariaDBサーバのバージョンに対応するマニュアルをチェックしてください。 END IF; END 'at line 10
うまくいけば(それを試してみましたが)、トリガーは動的なクエリをサポートしていません。 – antesoles
おっと、私はそれを見落とした - 私の変更を参照してください。 –