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'));
,因为我有超过执行这些查询的软件没有控制
对于插入部分,你可以设置在数据库中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
,您需要修改TRIGGER
为INSERT
部分使用table_name_real
代替table_name
使它动态但是,AFAIK,这将打破'INSERT'。如果VIEW不包含派生列,那么'VIEW'只能插入,INET_NTOA('ip')'是。 – Naltharial 2012-02-24 11:17:07
@Naltharial是的,你是对的。我没有意识到这一点,现在就进行测试。感谢您的更正。我有另一个想法,并会在稍后回来。 – Kaii 2012-02-24 11:38:05
对不起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
这个实时项目,我需要通过触发 – user533178 2012-02-24 09:56:55
更新了您的问题以包括您在评论中提供的重要相关信息 – Kaii 2012-02-24 10:01:19
'ip'字段的数据类型是什么? – Devart 2012-02-24 10:15:15
我需要数据与int现在varchar – user533178 2012-02-24 12:16:59