MySQL触发器 - 插入前的INET_ATON

时间:2012-02-24 09:16:33

标签: mysql

我需要在插入

之前将INET_ATON添加到ip字段
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'));

因为我无法控制执行这些查询的软件

2 个答案:

答案 0 :(得分:2)

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

并使用SELECT INET_NTOA(ip) FROM table

取回

答案 1 :(得分: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时,您需要修改TRIGGER部分的INSERT以使用table_name_real代替{ {1}}