InnoDB事务帮助 - 如果未找到则选择添加唯一行

时间:2009-11-12 11:10:37

标签: design-patterns transactions innodb

我有一个包含IPAddress部分的mysql表

TABLE `EndPoints`(
    `EndPointId` BIGINT(19) UNSIGNED NOT NULL AUTO_INCREMENT ,
    `IpPart1` TINYINT(3) UNSIGNED NOT NULL ,
    `IpPart2` TINYINT(3) UNSIGNED NOT NULL ,
    `IpPart3` TINYINT(3) UNSIGNED NOT NULL ,
    `IpPart4` TINYINT(3) UNSIGNED NOT NULL ,
    PRIMARY KEY (`EndPointId`))
ENGINE = InnoDB

每个IpPart包含IPAddress字节数组的字节。 例如地址 100.101.102.103
IpPart1 = 101;
IpPart2 = 102;
IpPart3 = 103;
IpPart4 = 104;


反正!

我想做以下事情:

SELECT EndPointId FROM EndPoints WHERE
    IpPart1 = @a AND
    IpPart2 = @b AND
    IpPart3 = @c AND
    IpPart4 = @d;

然后,如果找不到地址,请添加

INSERT INTO EndPoints (IpPart1,IpPart2,IpPart3,IpPart4)
    Values(@a,@b,@c,@d);

使用MySql事务,我如何确保每个IPAddress只添加一行?

谢谢!

1 个答案:

答案 0 :(得分:0)

可以 BEGIN一个事务,执行你引用的两个查询,然后执行COMMIT。但是只放一个UNIQUE键(IpPart1,IpPart2,IpPart3,IpPart4)会不会更容易?

(通过这种方式分离八位字节真的有什么好处吗?你似乎不太可能想要单独搜索和索引IpPart3。通常将IPv4地址存储为字符串或转换为简单整数inet_aton。使用规范化字符串或BINARY字符(16),IPv6地址可以多做一些工作。)