Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE or INSERT / 22 сообщений из 22, страница 1 из 1
08.02.2008, 13:13:27
    #35119659
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
пишу скрипт 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
08.02.2008, 13:25:43
    #35119722
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
...
Рейтинг: 0 / 0
08.02.2008, 14:28:53
    #35120014
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
tru55оно?
http://www.sql.ru/forum/actualtopics.aspx?search=merge&bid=6 Дао, выраженное словами, не есть истинное дао.
...
Рейтинг: 0 / 0
08.02.2008, 14:32:29
    #35120044
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
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
08.02.2008, 14:41:44
    #35120097
Esu
Esu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
DocAlВ-третьих, воспользуйтесь синтаксисом INSERT ... ON DUPLICATE KEY UPDATE.

replace помоему все же удобнее
http://phpclub.ru/mysql/doc/replace.html
...
Рейтинг: 0 / 0
08.02.2008, 14:43:34
    #35120113
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
Esu DocAlВ-третьих, воспользуйтесь синтаксисом INSERT ... ON DUPLICATE KEY UPDATE.replace помоему все же удобнее
http://phpclub.ru/mysql/doc/replace.htmlАвтор просил вставку либо апдейт, я дал ему вставку либо апдейт. Откуда я знаю, может, он на апдейт триггер вешать будет.
...
Рейтинг: 0 / 0
01.07.2008, 01:20:10
    #35402933
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
чисто теоритически, что лучше? тесты показывают одинаково..
Код: 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
01.07.2008, 02:52:14
    #35402958
xelaok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
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
01.07.2008, 12:45:18
    #35403791
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
точно...
а как же быть?
как выяснить?
...
Рейтинг: 0 / 0
01.07.2008, 21:32:13
    #35405304
xelaok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
yarnikточно...
а как же быть?
как выяснить?
может через хранимку?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.07.2009, 12:50:51
    #36105262
syabro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
Код: 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
Период между сообщениями больше года.
31.03.2015, 13:24:22
    #38922355
t
t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
REPLACE вначале сделает DELETE, а затем INSERT
согласитесь, это не похоже на UPDATE
...
Рейтинг: 0 / 0
31.03.2015, 13:47:31
    #38922415
UPDATE or INSERT
t,

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

На самом деле UPDATE (иногда) тоже сначала делает DELETE, а потом INSERT, и для того, чтобы до этого додуматься не нужно было ждать шесть лет.
...
Рейтинг: 0 / 0
01.04.2015, 07:53:16
    #38923297
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
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
01.04.2015, 08:00:09
    #38923303
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
> На самом деле UPDATE (иногда) тоже сначала делает DELETE, а потом INSERT, и для того, чтобы до этого додуматься не нужно было ждать шесть лет.
извиняюсь, а в каких случаях так происходит?
честно первый раз слышу про такое
И что триггер на DELETE срабатывает при этом?
...
Рейтинг: 0 / 0
01.04.2015, 10:18:10
    #38923427
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE or INSERT
[NT Man]> На самом деле UPDATE (иногда) тоже сначала делает DELETE, а потом INSERT, и для того, чтобы до этого додуматься не нужно было ждать шесть лет.
извиняюсь, а в каких случаях так происходит?
честно первый раз слышу про такое

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

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


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

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

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

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

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

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

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

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


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