Справка по транзакциям InnoDB - выберите, если не найдено Добавить уникальную строку - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть таблица mysql, содержащая части IP-адреса

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, как я могу обеспечить добавление только одной строки для каждого IP-адреса?

Спасибо!

1 Ответ

0 голосов
/ 12 ноября 2009

Ну, вы могли бы НАЧАТЬ транзакцию, выполнить два запроса, которые вы цитировали, затем COMMIT. Но не проще ли просто надеть УНИКАЛЬНЫЙ ключ (IpPart1, IpPart2, IpPart3, IpPart4)?

(Есть ли что-нибудь, что можно получить, разделив октеты таким образом? Кажется маловероятным, что вы захотите, например, искать и индексировать только IpPart3. Адреса IPv4 часто хранятся в виде строки или простого целого числа, преобразованного inet_aton . Адреса IPv6 немного сложнее, используя канонизированную строку или символ BINARY (16).)

...