запрос в MySQL -> INSERT IF ?????

stm7884696

народ, написать запрос, который бы добавлял запись в базу только если такой записи там нет... Проверка - по одному или двум полям. Всего полей - 3 и более., из которых одно -id автоинкримент...
т.е. Если есть:
1 маша 123
2 петя 345
3 коля 456
то запись маша 345 не добавилась, а запись саша 123 -добавилась...

sergey_m

Использовать нормальную БД, поддерживающую триггеры.

Marinavo_0507

а разве primary key не ровно для этого служит?

vall

почитай это
http://fgr/docs/mysql4/manual_toc.html
UNIQUE key - для этого и служит.

Marinavo_0507

ах да
значит, не только primary
только твоя ссылка в какое-то странное место ведёт

stm7884696

по уникуе - создаються индексы...
+если попытаюсь вставить не уникуе -выдаст ошибку и прекратит вставку...
А мне нужна именно проверка условия на существование!

sergei1969

тады забей на MySQL

vall

не понял.
ты хочешь попытатся втавить и потом узнать получилось ли ?
тогда втавляешь а потом смотриш mysql_affected_rows, типа скока вставилось.
(ну или на чём ты там пишешь ?)
ещё посмотри на INSERT IGNORE - хз, может понабится.
а если ты хочешь просто узнать есть ли оно - тут просто SELECT ^)

sergei1969

действительно, INSERT IGNORE
маза, не знал...

vijrel7878

странно, что никто не предложил такой вариант:
поискать в бд, если ничего не нашлось - вставить. Обойтись можно без всяких индексов (если так нужно). Ровным счетом то, что ты хочешь

sergei1969

имхо он его изначально отбросил, т.е. задача сделать это без select

sergey_m

странно, что никто не предложил такой вариант:
поискать в бд, если ничего не нашлось - вставить. Обойтись можно без всяких индексов (если так нужно). Ровным счетом то, что ты хочешь
Вот так и появляются race conditions.

sergey_m

ты хочешь попытатся втавить и потом узнать получилось ли ?
тогда втавляешь а потом смотриш mysql_affected_rows, типа скока вставилось.
mysql_affected_rows осмысленна для UPDATE и DELETE, но не для INSERT.
Хотя для INSERT FROM FILE (или как там в MySQL) может быть и осмысленна.

vijrel7878

Вот так и появляются race conditions.

а что это? Можешь пояснить?

pulmo

ты инсертом узнаешь что такой ячейки нет, и еще кто-то узнает то же самое в тот же момент, и вы вместе закидываете в базу одинаковые значения тем самым нарушая согласованность БД...

bastii

типа ты селект сделаешь, запись не найдешь и будешь инсерт делать, но в процессе кто-то вставит запись

vall

mysql_affected_rows осмысленна для UPDATE и DELETE, но не для INSERT.
Хотя для INSERT FROM FILE (или как там в MySQL) может быть и осмысленна.

mysql_affected_rows
СИНТАКСИС:
int mysql_affected_rows(MYSQL *mysql)
ОПИСАНИЕ:
Возвращает число строк, на которые воздействует последний UPDATE, DELETE или INSERT.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
Целое число > 0 показывает число измененных строк.
Ноль, если никакие записи не соответствовали предложению WHERE в UPDATE или DELETE.
-1, если запрос возвратил ошибку, например, была сделана попытка добавить двойной первичный ключ в течение одного INSERT.
-----
Если использован IGNORE, строки будут пропущен, если там уже существует запись с идентичным уникальным ключом. Если ни один из вышеупомянутых параметров не используется, будет выдана ошибка, и остальная часть будет игнорироваться, если найден дублирующий ключ.
-----
вот.

stm7884696

я хочу просмотреть одним запросом существование записи и если она не существует - добавить ее...
При этом - тип значения - текст, что значит, что уникальным я его сделать не могу...
ZB: Что нить типа такой конструкции: insert if not exist (mytext) into mytable (col1, col2) values (mytext, myvalue)
тока с правильным синтаксисом....
Оставить комментарий
Имя или ник:
Комментарий: