Каков наилучший способ сделать поле id md5 из полей username, body, msg_date в таблице? - PullRequest
0 голосов
/ 27 мая 2011
structure


CREATE TABLE IF NOT EXISTS `blabbing` (   
 `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 NOT NULL,
   `msg_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
   `body` varchar(255) CHARACTER SET utf8 NOT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=307 ;

Также, если я хочу добавить поле responseto, могу ли я использовать ту же структуру, что и поле body, потому что это ответ и будет иметь тот же тип данных, что и у поля.

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Не совсем уверен, что вы спрашиваете, но я думаю, вы хотите, чтобы поле содержало MD5 других значений, которые вы вставляете, и хотите, чтобы база данных обрабатывала это. Вы можете попробовать что-то вроде этого:

CREATE TRIGGER blabbing_insert BEFORE INSERT ON `blabbin` FOR EACH ROW SET NEW.id = md5(...);

Как намекают другие, если это просто для обеспечения уникальности, возможно, есть лучшие способы.

1 голос
/ 27 мая 2011
CREATE TRIGGER trig_tablename_insert
BEFORE INSERT ON `tablename`
FOR EACH ROW SET NEW.id = md5(username + body + CAST(msg_date AS CHAR));

Поскольку это, вероятно, первичный ключ, следует избегать использования хэш-функции в индексированном столбце.Хэш-функции не являются последовательными, поэтому упорядоченный индекс будет фрагментирован ОЧЕНЬ быстро.

Лучше всего создать триггер для проверки значений, которые еще не существуют, или добавить дополнительный кодкак часть вставки.Это сделает для намного более быстрых вставок.Используйте EXISTS с подзапросом для поиска совпадения.

1 голос
/ 27 мая 2011

Чтобы избежать дубликатов, сделайте запрос и проверьте, возвращает ли он false или true

SELECT body FROM blabbing WHERE username=X ORDER BY msg_date ASC LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...