powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE or INSERT
22 сообщений из 22, страница 1 из 1
UPDATE or INSERT
    #35119659
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пишу скрипт online на сайте в связи с чем появился вопрос, возможно ли указать mySQL что надо делать INSERT если нет записи и UPDATE если есть.
что то типа такого:
Код: plaintext
1.
2.
INSERT online SET ip = '$ip'
OR
UPDATE time=NOW() WHERE ip = '$ip';

таблица такая:
Код: plaintext
1.
2.
3.
CREATE TABLE `online` (
  `ip` varchar( 15 ) NOT NULL default '',
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35119722
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35120014
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55оно?
http://www.sql.ru/forum/actualtopics.aspx?search=merge&bid=6 Дао, выраженное словами, не есть истинное дао.
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35120044
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yarnikпишу скрипт online на сайте в связи с чем появился вопрос, возможно ли указать mySQL что надо делать INSERT если нет записи и UPDATE если есть.
что то типа такого:
Код: plaintext
1.
2.
INSERT online SET ip = '$ip'
OR
UPDATE time=NOW() WHERE ip = '$ip';

таблица такая:
Код: plaintext
1.
2.
3.
CREATE TABLE `online` (
  `ip` varchar( 15 ) NOT NULL default '',
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Во-первых, храните ip в INT, и сохраняйте/выводите с использованием INET_ATON()/INET_NTOA(), соответственно.
Во-вторых, задайте первичный, в крайнем случае, уникальный ключ по ip.
В-третьих, воспользуйтесь синтаксисом INSERT ... ON DUPLICATE KEY UPDATE.
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35120097
Esu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAlВ-третьих, воспользуйтесь синтаксисом INSERT ... ON DUPLICATE KEY UPDATE.

replace помоему все же удобнее
http://phpclub.ru/mysql/doc/replace.html
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35120113
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esu DocAlВ-третьих, воспользуйтесь синтаксисом INSERT ... ON DUPLICATE KEY UPDATE.replace помоему все же удобнее
http://phpclub.ru/mysql/doc/replace.htmlАвтор просил вставку либо апдейт, я дал ему вставку либо апдейт. Откуда я знаю, может, он на апдейт триггер вешать будет.
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35402933
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чисто теоритически, что лучше? тесты показывают одинаково..
Код: plaintext
1.
2.
3.
4.
SELECT BENCHMARK( 1000000 ,'INSERT INTO online (ip, time) VALUES  (INET_ATON(111.111.111.111), NOW()) ON DUPLICATE KEY UPDATE time=NOW()');
Отображает строки  0  -  0  ( 1  всего, запрос занял  0 . 0151  сек.)

SELECT BENCHMARK( 1000000 ,'REPLACE INTO online (ip, time) VALUE (INET_ATON(111.111.111.111), NOW())');
Отображает строки  0  -  0  ( 1  всего, запрос занял  0 . 0152  сек.)
случайно уже наткнулся на эту тему :-)
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35402958
xelaok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yarnikчисто теоритически, что лучше? тесты показывают одинаково..
Код: plaintext
1.
2.
3.
4.
SELECT BENCHMARK( 1000000 ,'INSERT INTO online (ip, time) VALUES  (INET_ATON(111.111.111.111), NOW()) ON DUPLICATE KEY UPDATE time=NOW()');
Отображает строки  0  -  0  ( 1  всего, запрос занял  0 . 0151  сек.)

SELECT BENCHMARK( 1000000 ,'REPLACE INTO online (ip, time) VALUE (INET_ATON(111.111.111.111), NOW())');
Отображает строки  0  -  0  ( 1  всего, запрос занял  0 . 0152  сек.)
случайно уже наткнулся на эту тему :-)

естессно одинаково, т.к. вы тестируете не запрос, а строку...
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35403791
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точно...
а как же быть?
как выяснить?
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #35405304
xelaok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yarnikточно...
а как же быть?
как выяснить?
может через хранимку?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
UPDATE or INSERT
    #36105262
syabro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
INSERT online SET ip = '$ip'
ON DUPLICATE KEY 
UPDATE time=NOW()
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
разумеется ip должен быть уникальными ключем.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
UPDATE or INSERT
    #38922355
t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
t
Гость
REPLACE вначале сделает DELETE, а затем INSERT
согласитесь, это не похоже на UPDATE
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38922415
t,

ты шесть лет ждал, чтобы написать свой ответ ???
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38922423
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tREPLACE вначале сделает DELETE, а затем INSERT
согласитесь, это не похоже на UPDATE

На самом деле UPDATE (иногда) тоже сначала делает DELETE, а потом INSERT, и для того, чтобы до этого додуматься не нужно было ждать шесть лет.
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38923297
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Вы правы, есть такая песня, /storage/innobase/row/row0mysql.cc:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
row_fts_do_update(
/*==============*/
    trx_t*      trx,        /* in: transaction */
    dict_table_t*   table,      /* in: Table with FTS index */
    doc_id_t    old_doc_id, /* in: old document id */
    doc_id_t    new_doc_id) /* in: new document id */
{
    if (trx->fts_next_doc_id) {
        fts_trx_add_op(trx, table, old_doc_id, FTS_DELETE, NULL);
        fts_trx_add_op(trx, table, new_doc_id, FTS_INSERT, NULL);
    }
}
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38923303
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> На самом деле UPDATE (иногда) тоже сначала делает DELETE, а потом INSERT, и для того, чтобы до этого додуматься не нужно было ждать шесть лет.
извиняюсь, а в каких случаях так происходит?
честно первый раз слышу про такое
И что триггер на DELETE срабатывает при этом?
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38923427
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[NT Man]> На самом деле UPDATE (иногда) тоже сначала делает DELETE, а потом INSERT, и для того, чтобы до этого додуматься не нужно было ждать шесть лет.
извиняюсь, а в каких случаях так происходит?
честно первый раз слышу про такое

update логически замена значение внутри записи физически это может быть либо такая замена либо другой вариант это замена одной записи на другую чем же естественно с тем же значением первичного ключа первичного ключа это как делается абсолютно во всех базах данных даже скорее сложно найти субд которая так не делает.

И что триггер на DELETE срабатывает при этом?[/quot]


нет конечно...
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38923485
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Пару слов о том когда такое происходит происходит это обычно тогда когда по сооброжениям производительности легче удалить физически записи в старом месте и в ставить в новом.

Например такое может случаться когда новая версия записи физически не влазит места где расположена старая записьтак же такое случается когда меняется значение первичного ключа таблицы
Это только наиболее распространенные случаикаждый базе данных есть свои особенности которые диктуют условия для того чтобы использовался этот механизм изменения.
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38923518
NT Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivMasterZiv,
Пару слов о том когда такое происходит происходит это обычно тогда когда по сооброжениям производительности легче удалить физически записи в старом месте и в ставить в новом.

Например такое может случаться когда новая версия записи физически не влазит места где расположена старая записьтак же такое случается когда меняется значение первичного ключа таблицы
Это только наиболее распространенные случаикаждый базе данных есть свои особенности которые диктуют условия для того чтобы использовался этот механизм изменения.

Понял это скрыто от пользователя. А то я испугался, думаю это при каких случаях вместо обновления одного поля удаляется вся запись запись с потерей хранящихся данных.

подумал что это 1 апрельский розыгрыш такой
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38923895
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,
круто, первый раз вижу человека, который так конкретно заглянул в исходники... :-) ... хотя сам и компилил - не открывал ни одного "сырца"
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38924404
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,

Да я тоже не особо "открывал". Сначала мне прислали по аське, а потом тупо грепнул по слову "update(" и убедился что это "оно". :)

Как понимаю, этот механизм используется в случаях когда "длина строки записи - ненормирована". То есть апдейт поля варчар запросто способен удлинить запись. У мускуля при создании таблички не здря же есть вариант "fixed". :)

Ну и тут уже выше сказали тоже...
...
Рейтинг: 0 / 0
UPDATE or INSERT
    #38924405
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неприятно то, что операции replace и update - практически "одно и тоже" по времени... ибо varchar() - "наше всё". :(
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE or INSERT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]