Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ON DUPLICATE KEY ничего не делать
 
 автор: Eugene77   (22.09.2008 в 20:02)   письмо автору
 
 

В цикле копируется множество таблиц
INSERT ... SELECT
Но среди целевых таблиц иногда попадаются уже заполненные имеющие индекс UNIQUE
Хотелось бы чтобы попытка перезаписать уже имеющиеся строки ни к чему не приводила, ни к ошибке ни к перезаписыванию.
Просто процесс копирования пропускал бы их.
Я пробовал использовать ON DUPLICATE KEY UPDATE,
но он хочет, чтобы я что-то сделал, если после этой фразы ничего не писать, то получается ошибка.
Как бы мне при попытке записать строку с повторяющимся ключом, просто не делать этого, а продолжать дальше?

  Ответить  
 
 автор: а-я   (22.09.2008 в 22:07)   письмо автору
 
   для: Eugene77   (22.09.2008 в 20:02)
 

1) указать IGNORE
или
2)

INSERT INTO `tbl`
 SELECT 
  *
 FROM `tbl2`
ON DUPLICATE KEY UPDATE ...;

  Ответить  
 
 автор: Eugene77   (23.09.2008 в 14:22)   письмо автору
 
   для: а-я   (22.09.2008 в 22:07)
 

>1) указать IGNORE
Тогда произойдёт копирование,которого я как раз хочу избежать
>или
>2)
>

>INSERT INTO `tbl`
> SELECT 
>  *
> FROM `tbl2`
>ON DUPLICATE KEY UPDATE ...;
>

Вот я так написал:
Request:
INSERT INTO m2.access (num,login,type,forum,access,tmp_period,last_update)
SELECT num,login,type,forum,access,tmp_period,last_update FROM m.access
ON DUPLICATE KEY ...

База ответила мне:
Error: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near '...' at line 1

  Ответить  
 
 автор: а-я   (24.09.2008 в 00:35)   письмо автору
 
   для: Eugene77   (23.09.2008 в 14:22)
 

1) Что-то я Вас не пойму. - Вам как надо?

Если в команде INSERT со строками, имеющими много значений, указывается ключевое слово IGNORE, 
то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы
 и не будут внесены. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, 
 имеющей дублирующееся значение существующего ключа. Количество строк, внесенных в данную таблицу,
 можно определить при помощи функции C API mysql_info(). 

2) =) вместо "..." надо уазать поля, которые надо обновить! =) если надо конечно)

  Ответить  
 
 автор: Eugene77   (28.09.2008 в 22:59)   письмо автору
 
   для: а-я   (24.09.2008 в 00:35)
 

Мне надо именно то, что вы даёте.
(1-й вариант).
Но проблема в том, что он почему-то не работает.
Какая-то ошибка в синтаксисе выявляется, а я не могу сообразить в чём она.
Я привёл полностью текст запроса, который вроде должен быть правильным, но он не работает.
У вас он работает?
То есть мне надо просто чтобы именно те строки, которые имеют дублирующиеся ключи не вставлялись, а остальные вставлялись. Ничего апдейтить не нужно.

  Ответить  
 
 автор: Trianon   (28.09.2008 в 23:40)   письмо автору
 
   для: Eugene77   (28.09.2008 в 22:59)
 

>Мне надо именно то, что вы даёте.
>(1-й вариант).
>Но проблема в том, что он почему-то не работает.
>Какая-то ошибка в синтаксисе выявляется, а я не могу сообразить в чём она.
>Я привёл полностью текст запроса, который вроде должен быть правильным, но он не работает.
>У вас он работает?
>То есть мне надо просто чтобы именно те строки, которые имеют дублирующиеся ключи не вставлялись, а остальные вставлялись. Ничего апдейтить не нужно.

Очень много слов. А текста запроса и текста диагностики нет.

А если речь о том, что тут неделю провисело, то может стоит попробовать убрать многоточие из кода?

  Ответить  
 
 автор: Eugene77   (01.10.2008 в 19:34)   письмо автору
 
   для: Trianon   (28.09.2008 в 23:40)
 

>А если речь о том, что тут неделю провисело, то может стоит попробовать убрать многоточие из кода?
Я пробовал:
Request:
INSERT INTO m1.access (num,login,type,forum,access,tmp_period,last_update)
 SELECT num,login,type,forum,access,tmp_period,last_update FROM m2.access ON DUPLICATE KEY 
Error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''

Ни многоточие, ни его отсутствие не отменяют синтаксической ошибки,
а вариант с IGNORE даёт не тот результат. Мне, наоборот, надо избежать копирования.

  Ответить  
 
 автор: Eugene77   (06.10.2008 в 19:11)   письмо автору
 
   для: Trianon   (28.09.2008 в 23:40)
 

>А если речь о том, что тут неделю провисело, то может стоит попробовать убрать многоточие из кода?
А у вас такой запрос без многоточия, или какой-нибудь похожий работает?

  Ответить  
 
 автор: Trianon   (06.10.2008 в 20:18)   письмо автору
 
   для: Eugene77   (06.10.2008 в 19:11)
 

INSERT INTO m1.access (num,login,type,forum,access,tmp_period,last_update)
 SELECT num,login,type,forum,access,tmp_period,last_update FROM m2.access 
ON DUPLICATE KEY SET num=num

  Ответить  
 
 автор: Eugene77   (07.10.2008 в 15:27)   письмо автору
 
   для: Trianon   (06.10.2008 в 20:18)
 

>
INSERT INTO m1.access (num,login,type,forum,access,tmp_period,last_update)
> SELECT num,login,type,forum,access,tmp_period,last_update FROM m2.access 
>ON DUPLICATE KEY SET num=num


И я так делал всегда, хотя считал, что это не совсем чистый код.
Но в этой ситуации почему-то не прошло даже это: ambigous
Впрочем, действительно, num из какой таблицы в какую приравнивать?
Можно, конечно и добавить названия таблиц, но поскольку запрос формируется всякий раз скриптом, получается сложный код.

Ну что ж, видно ничего не поделать.
Спасибо за советы!

  Ответить  
 
 автор: а-я   (29.09.2008 в 00:04)   письмо автору
 
   для: Eugene77   (28.09.2008 в 22:59)
 

Этот код Вы пробовали?

INSERT IGNORE INTO 
 m2.access (num,login,type,forum,access,tmp_period,last_update) 
SELECT 
 num,login,type,forum,access,tmp_period,last_update 
FROM m.access 

  Ответить  
 
 автор: hockfan   (13.10.2010 в 22:38)
 
   для: Eugene77   (22.09.2008 в 20:02)
 

INSERT IGNORE ... SELECT ...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования