INSERT и UPDATE в одном запросе. Возможно?

goshaua

Новичок
INSERT и UPDATE в одном запросе. Возможно?

Доброго времени суток!

Возможно ли сделать запрос типа:
(нужно в одном запросе добавить новую сроку и обновить уже существующую)
PHP:
$sql = "INSERT INTO categories (parent,  level, name_ua, name_en) VALUES ('$parent',  '$level',  '$name_ua',  '$name_en')"
      ."UPDATE categories SET children = children + 1 WHERE id = '$parent'";
mysql_query($sql);
Если возможно, то как?
 

zerkms

TDD infected
Команда форума
zerkms
тем, что конструкция:

a) делаем SELECT COUNT на предмет наличия записи
b.1) если нет - INSERT
b.2) если есть - children = children + 1

в любом случае хуже, чем предложенный INSERT ... ON DUPLICATE UPDATE
я бы даже сказал не то, что хуже - он эквивалентен по функционалу, но более лаконичный и быстрый.
 

Фанат

oncle terrible
Команда форума
не знаю. мне кажется, это не тот вопрос, которым имеет смысл озабочиваться, если у тебя все в одной строке.
а если надо сделать две операции - одну строку вставить, а торую обновить - то это и вовсе дуремарство, искать сделать это одним запросом.
 

zerkms

TDD infected
Команда форума
*****
у него одна операция: вставка, если записи не существует; обновление счётчика, если запись уже есть.
решение в лоб будет состоять из 2х запросов и 1го ветвления в пхп.
решение с INSERT ... ON DUPLICATE UPDATE это 1 запрос и всё.
 

Фанат

oncle terrible
Команда форума
ты уверен? у него в тексте не написано или. у него написано и.
 

zerkms

TDD infected
Команда форума
ёклмн, я слепой :)))))
пардон :))))

читал невнимательно. каюсь.
 

findnext

Новичок
это делается с помощью простого триггера

-~{}~ 06.04.09 11:48:

goshaua
иди узнай что такое триггеры и с чем их кушают

-~{}~ 06.04.09 11:50:

[sql]
DELIMITER $$

DROP TRIGGER /*!50032 IF EXISTS */ `comments_counter`$$

create trigger `comments_counter` BEFORE INSERT on `comments_counter`
for each row BEGIN
UPDATE `blog` SET `comments_count` = (comments_count + 1) WHERE id = NEW.blog_id;
END;
$$

DELIMITER ;
[/sql]

вот тебе и пример, осталось только названия полей поменять...
 
Сверху