1

Тема: Некорректная работа MySQL-запроса REPLACE

Мозги кипят и лезут из ушей. Сижу целый день, все пытался своим умом дойти - не вышло.
Вчера все грузилось нормально, а сегодня что-то случилось с phpMyAdmin. Привожу пример данных, которые я патаюсь загрузить:

REPLACE INTO `products` VALUES (1000, '', '', '',"EASYDOWNHILL", '', '', '', '', '',"EASYDOWNHILL.jpg",14.95, '', '', '', '', '',1,1, '', '',9, '',0, '', '', '', '', 0);
REPLACE INTO `products` VALUES (1001, '', '', '',"EASYDRUMS", '', '', '', '', '',"EASYDRUMS.jpg",14.95, '', '', '', '', '',1,1, '', '',9, '',0, '', '', '', '', 0);
REPLACE INTO `products` VALUES (1002, '', '', '',"EASYFISHING", '', '', '', '', '',"EASYFISHING.jpg",14.95, '', '', '', '', '',1,1, '', '',9, '',0, '', '', '', '', 0);
REPLACE INTO `products` VALUES (1003, '', '', '',"EASYGOLF", '', '', '', '', '',"EASYGOLF.jpg",14.95, '', '', '', '', '',1,1, '', '',9, '',0, '', '', '', '', 0);
REPLACE INTO `products` VALUES (1004, '', '', '',"EASYGUITARDLX", '', '', '', '', '',"EASYGUITARDLX.jpg",14.95, '', '', '', '', '',1,1, '', '',9, '',0, '', '', '', '', 0);
REPLACE INTO `products` VALUES (1005, '', '', '',"EASYINLINESKATE", '', '', '', '', '',"EASYINLINESKATE.jpg",14.95, '', '', '', '', '',1,1, '', '',9, '',0, '', '', '', '', 0);

В первой колонке ID товара, от 624 до 1726.
Получил сообщение, что все прошло успешно, но товара в магазине не увидел, а, заглянув в таблицу, увидел, что данные не заменились, а добавились, но с ID уже начиная от 1727 до 2829.
Тогда я удалил из таблицы все с 624 по 2829, и загрузил еще раз, заменив REPLACE на INSERT. Загрузка прошла успешно, но ID уже с 2830 по 4557, т.е. phpMyAdmin не смотрит, что я ему там пишу, а лепит свое.
Сейчас, заглянув в phpMyAdmin, увидел такую надпись:

Этот MySQL сервер работает 0 дней, 21 часов, 44 минут и 24 секунд. Он был запущен Авг 01 2006 г., 20:03.

Если я правильно понимаю MySQL сервер был переустановлен, или перезапущен, или что еще с ним можно сделать. Может в этом "собака зарыта"?

2

Re: Некорректная работа MySQL-запроса REPLACE

Vit
Я предполагаю, что дело все в запросе, точнее - в его синтаксисе. Дело в том, что можно не указывать названия столбцов (что собственно у тебя и сделано), тогда данные будут вставляться в том порядке и очереди, в каком следуют в таблице.

Предполагаю, что в процессе твоих манипуляций с таблицами количество столбцов  увеличилось, и следствием этого стало смещение вставки от ID, который перестал указываться явным образом и сработал механизм вставки (т.к. REPLACE - это аналог INSERT) и автоинкремент, именно поэтому данные не заменяются, а добавляются.

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

3

Re: Некорректная работа MySQL-запроса REPLACE

Vit
Чтобы поле ID вело счет с 624 (как ты хочешь), пропиши в запросе

ALTER TABLE <имя таблицы> AUTO_INCREMENT=624
Жизнь прекрасна... пока Яндекс не глючит! wink

4

Re: Некорректная работа MySQL-запроса REPLACE

Stinger

Чтобы поле ID вело счет с 624 (как ты хочешь), пропиши в запросе

Насколько я понял, у него проблема не с тем с какого номера начинается нумерация товара по ID, а в том что вместо замещения происходит добавление записей.

Vit:
Получил сообщение, что все прошло успешно, но товара в магазине не увидел, а, заглянув в таблицу, увидел, что данные не заменились, а добавились, но с ID уже начиная от 1727 до 2829.

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

5

Re: Некорректная работа MySQL-запроса REPLACE

Lokki

Тогда я удалил из таблицы все с 624 по 2829, и загрузил еще раз, заменив REPLACE на INSERT. Загрузка прошла успешно, но ID уже с 2830 по 4557, т.е. phpMyAdmin не смотрит, что я ему там пишу, а лепит свое.

Судя по этим словам, это тоже проблема (а может, просто пока не понял как поле с AUTO_INCREMENT'ом работает).

Это Vit на будущее, мало ли, пригодится wink

Жизнь прекрасна... пока Яндекс не глючит! wink

6

Re: Некорректная работа MySQL-запроса REPLACE

Stinger

Чтобы поле ID вело счет с 624 (как ты хочешь), пропиши в запросе

Думаю, скорее он хочет, чтобы вставились записи именно с теми значениями ID которые он "заказывает" в своем запросе.

т.е. phpMyAdmin не смотрит, что я ему там пишу, а лепит свое.

Если запрос корректен, то и INSERT вставит в поле ID при явном указании именно то значение, что указано в запросе. Даже без использования ALTER TABLE. Вот если бы он спросил: есть таблица, в ней записи, последняя имеет ID=35, но при добавлении следующих вместо 36, 37... присваивается 91, 92 и т.д. Тогда да - ALTER TABLE <имя таблицы> AUTO_INCREMENT=36. А здесь совершенно другой случай. ИМХО разумеется.

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

7

Re: Некорректная работа MySQL-запроса REPLACE

(а может, просто пока не понял как поле с AUTO_INCREMENT'ом работает).

Честно говоря, понятия не имею, что это такое и как оно работает. Видел при экспорте "Добавить значение AUTO_INCREMENT" по умолчанию отмечено, а при импорте такого нет и вообще нет опций в SQL. Может просветите?

8

Re: Некорректная работа MySQL-запроса REPLACE

Lokki
он сначала удалил записи в таблице

Тогда я удалил из таблицы все с 624 по 2829, и загрузил еще раз, заменив REPLACE на INSERT.

но счетчик не обнулил и не задал никого конкретного значения, поэтому AUTO_INCREMENT'ом вставлялось новое значение для поля ID (INSERT ведь, а не UPDATE). wink

Жизнь прекрасна... пока Яндекс не глючит! wink

9

Re: Некорректная работа MySQL-запроса REPLACE

Vit
AUTO_INCREMENT служит для автоматической генерации последовательности значений.

Значения являются строго возрастающими и не могут использоваться повторно, т.е. если текущее максимальное значение составляет 57 и запись, содержащая это значение, была удалена, то следующее генрируемое значение будет 58.

В таблице может быть только один столбец с AUTO_INCREMENT.

Это вкратце, если что не понятно, спрашивай.

Жизнь прекрасна... пока Яндекс не глючит! wink

10

Re: Некорректная работа MySQL-запроса REPLACE

Stinger

он сначала удалил записи в таблице
но счетчик не обнулил и не задал никого конкретного значения, поэтому AUTO_INCREMENT'ом вставлялось новое значение для поля ID (INSERT ведь, а не UPDATE).

внимательно читаем первый пост:

REPLACE INTO `products` VALUES (1005, '', '', '',"EASYINLINESKATE", '', '', '', '', '',"EASYINLINESKATE.jpg",14.95, '', '', '', '', '',1,1, '', '',9, '',0, '', '', '', '', 0);

В первой колонке ID товара, от 624 до 1726.

Кто-то еще сомневается, что он пытался указать в запросе ID? Иначе, если не указывать ID (ключ) - смысла в REPLACE нет никакого.

В общем, прекращаем демагогию разводить. Пусть Vit сам уточнит при необходимости нюансы вопроса.

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

11

Re: Некорректная работа MySQL-запроса REPLACE

Lokki
согласен, а то дебаты не по теме, а Vit молчит.

Жизнь прекрасна... пока Яндекс не глючит! wink

12

Re: Некорректная работа MySQL-запроса REPLACE

Кто-то еще сомневается, что он пытался указать в запросе ID?

Именно так. Мне надо было не просто добавить значения, а с конкретными ID. И раньше я так и делал, указывал ID и REPLACE и все проходило нормально. А теперь почему-то не замещается, а добавляется. И случилось это после того, как:

Этот MySQL сервер работает 0 дней, 21 часов, 44 минут и 24 секунд. Он был запущен Авг 01 2006 г., 20:03.

Если я правильно понимаю MySQL сервер был переустановлен, или перезапущен, или что еще с ним можно сделать. Может в этом "собака зарыта"?

13

Re: Некорректная работа MySQL-запроса REPLACE

Stinger

согласен, а то дебаты не по теме, а Vit молчит.

Администратору не нужно согласие, мне нужно чтобы людям здесь помогали решать проблемы. А флейм этому не способствует. Вот так вот - это предупреждение.
Vit
Покажи свою таблицу. Сделай в phpMyAdmin дамп таблицы, скопируй оттуда блок CREATE TABLE до запросов замещения/вставки и опубликуй его здесь

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

14

Re: Некорректная работа MySQL-запроса REPLACE

Всем спасибо!
Сегодня почему-то получилось. Попробовал еще раз - удалил, загрузил и все встало на свои места, и товар в магазине появился, и все работает как надо. Что это было - непонятно, но как появилось, так и пропало. Подозреваю я, что это мой хостер что-то химичит.
Но все хорошо, что хорошо кончается.