Вставить в таблицу значение, если его нет в базе (одним SQL запросом)

artnik7

Новичок
Мне нужно вставить в таблицу значения в случае если их там нет. Сейчас у меня туда записываются много повторов. Таблица простоая, в ней два поля - ID и word.
Можно изобрести "велосипед" и сделать двумя запросами, но это не вариант:
PHP:
$wordExists = mysql_query("SELECT id FROM tablename WHERE word='$word' LIMIT 1");
if (! $wordExists) mysql_query("INSERT INTO tablename SET word='$word'");
Есть ли способ сделать так одним запросом?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
При таком подходе, если не ошибаюсь, можно получить грабли с AUTO_INCREMENT
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну ты попробуй, протестируй)

Особенно будет весело, когда от autoincrement поля будут идти связки.
 

artnik7

Новичок
Протестил. Автоинкримент вроде нормально работает, c0dex, объясни, пожалуйста, где мне искать багу? Или как работает insert replace с unique столбцом. Ато я не пойму что и где нужно править.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну я писал о том, что если у тебя таблица такой структуры:

Код:
CREATE TABLE IF NOT EXISTS `auto_incr` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `value` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `value` (`value`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

INSERT INTO `auto_incr` (`id`, `value`) VALUES
(1, 'test'),
(2, 'test1'),
(3, 'test2'),
(4, 'test3');
То при наличии связок id -> к чему-то еще, то есть к другой таблице, запрос вида:
Код:
REPLACE INTO  `auto_incr` SET value =  'test2'
приведет к тому, что у тебя у значения value=test2 будет уже id=5...

Дальше думай сам, как это может поломать тебе приложение.
 

artnik7

Новичок
А если структура таблицы немного другая? Я ее через PHP создал этим запросом:
PHP:
CREATE TABLE IF NOT EXISTS notranslation_words (
    id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    word varchar(125) NOT NULL,
    UNIQUE(word))
ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
artnik7
Полагаю, разницы не будет никакой.
 

artnik7

Новичок
Вурдалак почему сразу глупый если я в sql толком не шарю? Я думал может отличие будет в прикреплении "UNIQUE KEY `value` (`value`)" и в "UNIQUE(value)".
c0dex Ладно, спасибо, буду читать faq по insert replace, ignore, dublicate key update
 

vovanium

Новичок
artnik7
Запрос получился такой "REPLACE INTO notranslation_words SET word='$word'". И все ок, работает. Повторения уже не сохраняются.
Вообще-то в таком случае повторения как раз сохраняются, просто они заменяют слово, на такое же слово. Потому собственно и называется REPLACE. Тебе нужно юзать INSERT IGNORE, тогда в случае дубликата, строка игнорируется.
 

Jon

Новичок
А если данные есть, ты их будешь редактировать или нет? Если редактировать то тебе понадобится Id строки, и как ты его получишь?
 

artnik7

Новичок
Если понадобится редактировать, то можно так-же через insert replace по значению применить. Ведь оно тоже уникальное, как и ключ (id)
 
Сверху