# Главная
# О библиотеке

# Выбор дистрибутива
преимущества Linux/UNIX | основные дистрибутивы | серверный Linux | BSD | LiveCDs | прочее

# Установка и удаление программ
общие вопросы | каталоги софта | специальные случаи

# Настройка и работа
установка, загрузчики | настройка Linux | консоль | файловые системы | процессы | шеллы, русификация, коммандеры | виртуальные машины, эмуляторы

# X Window и оконные менеджеры
настройка X Window | GNOME | KDE | IceWM и др.

# Работа с текстами
редакторы | офис | шрифты, кодировки и русификация | преобразования текстовых файлов | LaTeX, SGML и др. | словари

# Графика
GIMP | фото | обработка изображений | форматы графических файлов

# Сети, администрирование
общие вопросы | Dialup & PPP | брандмауэры | маршрутизация | работа в Windows-сетях | веб-серверы | Apache | прокси-серверы | сетевая печать | прочее

# Программирование
GCC & GNU make | программирование в UNIX | графические библиотеки | Tcl | Perl | PHP | Java & C# | СУБД | CVS | прочее

# Ядро
# Мультимедиа
# Интернет
# Почта
# Безопасность
# Железо
# Разное

# Linux HowTo (как сделать)
# Книги и руководства
# Материалы на английском языке


MySQL The World's Most Popular Open Source Database # Online shop | Site map |  
CompanyProductsSupport & ConsultingTraining & CertificationDownloadsDocumentation
  BooksArticlesMailing ListsPresentationsOther Sites  
Search the MySQL manual:
MySQL Manual
  • 6 Справочник по языку MySQL
    • 6.4 Обработка данных: SELECT, INSERT, UPDATE, DELETE
      • 6.4.1 Синтаксис оператора SELECT
      • 6.4.2 Синтаксис оператора HANDLER
      • 6.4.3 Синтаксис оператора INSERT
      • 6.4.4 Синтаксис оператора INSERT DELAYED
      • 6.4.5 Синтаксис оператора UPDATE
      • 6.4.6 Синтаксис оператора DELETE
      • 6.4.7 Синтаксис оператора TRUNCATE
      • 6.4.8 Синтаксис оператора REPLACE
      • 6.4.9 Синтаксис оператора LOAD DATA INFILE
      • 6.4.10 Синтаксис оператора DO

Buy this Reference Manual in softcover from Barnes & Noble!

MySQL Reference Manual
Previous / Next / Up / Table of Contents

6.4.8 Синтаксис оператора REPLACE

    REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        VALUES (expression,...),(...),...
или REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
или REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tbl_name
        SET col_name=expression, col_name=expression,...

Оператор REPLACE работает точно так же, как INSERT, за исключением того, что если старая запись в данной таблице имеет то же значение индекса UNIQUE или PRIMARY KEY, что и новая, то старая запись перед занесением новой будет удалена. See section 6.4.3 Синтаксис оператора INSERT.

Другими словами, команда REPLACE не предоставляет доступа к замещаемой записи. В некоторых старых версиях MySQL такой доступ иногда оказывался возможным, но это был дефект, который уже исправлен.

При использовании команды REPLACE функция mysql_affected_rows() вернет значение, равное 2, если старая строка была заменена новой. Объясняется это тем, что сначала в таблицу вставляется одна строка, а затем удаляется вторая - дубликат.

Это позволяет легко определять, какое действие произвела команда REPLACE - добавление или замещение строки. Достаточно просто проверить, какое число вернула функция mysql_affected_rows() - 1 (строка добавлена) или 2 (замещена).

Следует учитывать, что, если не используются индексы UNIQUE или PRIMARY KEY, то применение команды REPLACE не имеет смысла, так как она работает просто как INSERT.

User Comments

Posted by [name withheld] on Friday August 30 2002, @1:35pm[Delete] [Edit]

Although it is clearly stated here, it is worth
reiterating that REPLACE does not UPDATE the
existing record. When REPLACING records with an
autonumbered primary key, the autonumber column
DOES change as the old row is deleted and a new
one added.

Posted by Mark Hechim on Friday September 6 2002, @4:10pm[Delete] [Edit]

If you use the form: {REPLACE (a, b) SELECT 1, 2},
why do you get an error where {REPLACE (a, b)
SELECT x, y FROM blah} works just fine?

Posted by Juan C. Olivares on Friday October 11 2002, @11:41pm[Delete] [Edit]

Note that REPLACE will not update the information of
the row. It performs a DELETE and INSERT query.
When you excecute "REPLACE INTO table (col1,
col2) VALUES (val1, val2)" where col1 is the index,
all the other column values will be deleted. There is
not any REPLACE for UPDATE or INSERT.

Posted by Ben Riddell on Thursday March 6 2003, @3:05pm[Delete] [Edit]

Re: the first post -
If you don't want your autoincrementing field to change with a REPLACE query, create a UNIQUE INDEX which includes that field and pass the existing value for that field in the query.

Add your own comment.

Top / Previous / Next / Up / Table of Contents
# MySQL.com home | Site map | Contact us | Press | Jobs | Privacy policy | Trademark info | © 1995-2003 MySQL AB. All rights reserved.