Эта тема на forum.dklab.ru


Валенок: второй уникальный ID ?
Задача такова: у каждого поля в таблицы должны быть два уникальных параметра ID (UsID и ScID), причем надо, чтобы они были максимально независимы (гм... чтобы не существовала такая функция f(x), не обращающаяся к БД, что f(UsID) = ScID (или наоборот)).

Если один из параметров мускул легко генерирует, то другой (по-моему) придется генерировать с помощью рандома с проверкой каждого значения на уникальность... как мне лучше всего это реализовать?
dimagolov:
можно генерить хеш от первого ID со случайной солью. вероятность того, что продублируются, минимальна. CRC32 как раз дает 32-битное unsigned value
Валенок:
dimagolov

чтобы не существовала такая функция f(x), не обращающаяся к БД, что f(UsID) = ScID (или наоборот)

а тут она существует: как раз функция md5 (или другая). надо чтобы они были независимы :(
dimagolov:
со случайной солью все будет как надо. более того. если сделать unique key (составной на 2 поля) то если ошибка на insert, то просто перегенерить второй id. можно хранимой процедурой сделать.
Валенок:
dimagolov т.е. вы предлагаете сделать оба уник кей, а потом проверять, сработала куери или нет? :) спасибо, попробую. а про хранимые процедуры ничего не знаю, если не сложно, дайте код :) (это так, просьба, да да, я уже ушел в гугль искать ;) )
dimagolov:
взял первую попавшуюся...


DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `SaveMemo`(DateString Date, CurrentEntityId BIGINT, sMemoText mediumtext)
BEGIN

DECLARE MemoCount INT;
SELECT Count(EntityId) FROM tblMemo WHERE MemoDate = DateString AND EntityId = CurrentEntityId INTO MemoCount;
IF MemoCount = 0 THEN
INSERT INTO tblMemo VALUES ( null, DateString, sMemoText , CurrentEntityId);
ELSE
UPDATE tblMemo SET MemoText = sMemoText WHERE MemoDate = DateString AND EntityId = CurrentEntityId;
END IF;

END;;
DELIMITER ;


потом в запросе просто CALL SaveMemo ('2007-05-12', 123, 'asfdasfdafd');

хм.... проблема в том, что при insert мы не знаем какой будет auto_increment value, так что как ни крути минимум 2 запроса будет.
хотя нет. можно засунуть это в триггер before insert. он УЖЕ знает какой будет NEW.AutoIncField и может от него считать второй ключ.

Эта тема на forum.dklab.ru