MySQL的触发器 - 插入

问题描述:

我需要添加到INET_ATON知识产权领域之前INET_ATON前插入MySQL的触发器 - 插入

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

我需要向数据库中插入前透明转换的IP。 并选择将其转换回用INET_NTOA()

不能更改查询使用

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

,因为我有超过执行这些查询的软件没有控制

+0

更新了您的问题以包括您在评论中提供的重要相关信息 – Kaii 2012-02-24 10:01:19

+0

'ip'字段的数据类型是什么? – Devart 2012-02-24 10:15:15

+0

我需要数据与int现在varchar – user533178 2012-02-24 12:16:59

对于插入部分,你可以设置在数据库中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,您需要修改TRIGGERINSERT部分使用table_name_real代替table_name

+0

使它动态但是,AFAIK,这将打破'INSERT'。如果VIEW不包含派生列,那么'VIEW'只能插入,INET_NTOA('ip')'是。 – Naltharial 2012-02-24 11:17:07

+0

@Naltharial是的,你是对的。我没有意识到这一点,现在就进行测试。感谢您的更正。我有另一个想法,并会在稍后回来。 – Kaii 2012-02-24 11:38:05

+0

对不起sql错误#1064 - 你的SQL语法有错误; '.ip' = INET_ATON(NEW.'ip');使用正确的语法检查对应于您的MySQL服务器版本的手册。 – user533178 2012-02-24 12:04:21

你可以使用INSERT INTO ( ID , ip ) VALUES (NULL, INET_ATON('127.0.0.1'));插入db

并返回使用SELECT INET_NTOA(ip) FROM table

+0

这个实时项目,我需要通过触发 – user533178 2012-02-24 09:56:55