2012-02-24 8 views
0

前に、私はフィールドをIP INET_ATONを追加する必要がある前に、私は挿入する前に透過的にIPアドレスを変換するためのデータベースが必要MySQLのトリガ - INET_ATON挿入

INSERT INTO (`id`,`ip`) VALUES (NULL,'127.0.0.1'); 

を挿入します。 とINET_NTOA()で選択変換、それを後ろに

I 私はこれらのクエリを実行するソフトウェアを制御することはできませんので

INSERT INTO (`id`,`ip`) VALUES (NULL,INET_ATON('127.0.0.1')); 

を使用するクエリを変更することはできません

+0

あなたのコメントは、あなたがコメントに入力した重要な関連情報を含めるように更新されました – Kaii

+0

'ip'フィールドのデータタイプとは何ですか? – Devart

+0

私はint型のデータを必要としていますが、現在はvarchar – user533178

答えて

2

することができます挿入部の設定データベース内TRIGGER BEFORE INSERTについて:

DELIMITER | 
DROP TRIGGER IF EXISTS `before_insert_ip`| 
CREATE TRIGGER `before_insert_ip` BEFORE INSERT ON `table_name` 
FOR EACH ROW 
BEGIN 
    SET NEW.`ip` = INET_ATON(NEW.`ip`); 
END; 
| 
delimiter; 

SELECT部分​​は少しトリッキーです。 mysqlにはAFTER SELECTというトリガはありません。これを使用して、アプリケーションコードに戻ってIPを変換することができます。

代わりに、あなたは本当のテーブルの名前を変更し、VIEWの後ろにそれを隠すことができます:

RENAME TABLE `table_name` TO `table_name_real`; 

CREATE OR REPLACE VIEW `table_name` (`id`, `ip`) AS 
    SELECT `id`, INET_NTOA(`ip`) AS `ip` FROM `table_name_real`; 

注:あなたはこのVIEWを使用する場合、あなたの代わりにtable_name_realを使用するINSERT一部にTRIGGERを変更する必要がありますtable_name

+0

しかし、AFAIKは、それは 'INSERT'を破るだろう。 'VIEW'は、' INET_NTOA( 'ip')'である派生カラムを含まない場合にのみ挿入可能です。 – Naltharial

+0

@Naltharialはい、あなたは正しいです。私はそれを認識しておらず、今すぐテストしました。訂正してくれてありがとう。私は別のアイデアを持っており、後でそれに戻ってくるでしょう。 – Kaii

+0

sorry sqlエラー#1064 - SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文が近くで使用できるようにしてください。 '.'ip' = INET_ATON(NEW.'''); – user533178

0

することができますINSERT INTO ( id , ip ) VALUES (NULL, INET_ATON('127.0.0.1'));を使用してdbに挿入する

SELECT INET_NTOA(ip) FROM table

+0

ライブのプロジェクトに満足していると私はそれをトリガーで動的にする必要がある – user533178