Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: INSERT ... ON DUPLICATE KEY UPDATE (Как правильно?)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Как правильно использовать INSERT ... ON DUPLICATE KEY UPDATE
Нирвана
Отправлено: 03 Января, 2008 - 16:43:27
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Приветствую господа кодеры!
Суть вопроса такова, как использовать INSERT ... ON DUPLICATE KEY UPDATE на моем примере?
Цитата:
CREATE TABLE `demo` (
`id` int(11) NOT NULL auto_increment,
`test` int(11) NOT NULL default '0',
`teni` text NOT NULL,
`opisanie` text NOT NULL,
`dopinfo` text NOT NULL,
`visual` text NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM;


Цитата:
for ($i=0;$i<$base;$i++)
{
$zapros = "SELECT * from `demo` WHERE test=$test";
$result=mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');

if (mysql_affected_rows()==0)
{
$zapros = "insert into `demo` (test, teni, opisanie, dopinfo, visual) VALUES ('$test', '$teni', '$opisanies', '$dopinfos', '$visual')";
$result = mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');

} else {
$zapros = "UPDATE `demo` SET teni='$teni' WHERE test=$test";
$result=mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');
}
}


Уникальные ключи содержаться в test!!!
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 17:52:01
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




http://www[dot]webber[dot]ru/articles/article35355[dot]html

Цитата:
Если вы указываете ON DUPLICATE KEY UPDATE (новшество в MySQL 4.1.0), и производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY) или уникального (UNIQUE) ключа, то вполняется UPDATE старой строки. Например:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

Если a определяется как UNIQUE и уже содержит 1, то тогда вышеуказанная команда будет аналогична следующей:

UPDATE table SET c=c+1 WHERE a=1;
 
 Top
Нирвана
Отправлено: 03 Января, 2008 - 18:30:59
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




evgenijj пишет:
http://www[dot]webber[dot]ru/articles/article35355[dot]html

Цитата:
Если вы указываете ON DUPLICATE KEY UPDATE (новшество в MySQL 4.1.0), и производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY) или уникального (UNIQUE) ключа, то вполняется UPDATE старой строки. Например:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

Если a определяется как UNIQUE и уже содержит 1, то тогда вышеуказанная команда будет аналогична следующей:

UPDATE table SET c=c+1 WHERE a=1;


Эту статью я видел, она одна на куче сайтов. Насколько я понимаю а - это ID. А вот тут загвоздка, так как уникальность находится в поле test, а не в id.
Цитата:
for ($i=0;$i<$base;$i++)
{
$zapros = "SELECT * from `demo` WHERE test=$test";
$result=mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');
if (!mysql_num_rows($result))
{
$zapros = "insert into `demo` (test, teni, opisanie, dopinfo, visual) VALUES ('$test', '$teni', '$opisanies', '$dopinfos', '$visual')
ON DUPLICATE KEY UPDATE
`teni`=VALUES(`teni`)";
$result = mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');
}


Но в данном случае происходит почему то только вставка, а апдейт не происходит. В чем затык?? Возможно, что в таблицу нужно еще добавить UNIQUE, только какой именно?
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 19:47:29
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Цитата:
А вот тут загвоздка, так как уникальность находится в поле test, а не в id

Ты вообще читать-то умеешь?
Цитата:
Если вы указываете ON DUPLICATE KEY UPDATE, и производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY) или уникального (UNIQUE) ключа, то вполняется UPDATE старой строки

Где у тебя указано, что поле test -- UNIQUE?

Цитата:
CREATE TABLE `demo` (
`id` int(11) NOT NULL auto_increment,
`test` int(11) NOT NULL default '0',
`teni` text NOT NULL,
`opisanie` text NOT NULL,
`dopinfo` text NOT NULL,
`visual` text NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM;
 
 Top
Нирвана
Отправлено: 03 Января, 2008 - 20:53:15
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. CREATE TABLE `demo` (
  2. `id` int(11) NOT NULL auto_increment,
  3. `test` VARCHAR(10) UNIQUE NOT NULL,
  4. `teni` text NOT NULL,
  5. `opisanie` text NOT NULL,
  6. `dopinfo` text NOT NULL,
  7. `visual` text NOT NULL,
  8. PRIMARY KEY (`id`)
  9. ) TYPE=MyISAM;

Что-то наподобие? Попробую, только у меня сомнения, что код вставки и апдейта будет работать.
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 21:03:29
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Нирвана пишет:
Попробую, только у меня сомнения, что код вставки и апдейта будет работать

Гм, интересно тебя послушать: "Вот в мануале написано про такую возможность, как ON DUPLICATE KEY. Что-то я сильно сомневаюсь, что эта фигня будет работать. Знаю я этих ребят - разработчиков MySQL: любят приврать..."
 
 Top
Нирвана
Отправлено: 03 Января, 2008 - 21:43:17
Post Id



Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




evgenijj пишет:
Нирвана пишет:
Попробую, только у меня сомнения, что код вставки и апдейта будет работать

Гм, интересно тебя послушать: "Вот в мануале написано про такую возможность, как ON DUPLICATE KEY. Что-то я сильно сомневаюсь, что эта фигня будет работать. Знаю я этих ребят - разработчиков MySQL: любят приврать..."


А я не про разработчиков MySQL, а про вот это Улыбка)))))))))))))))))
Ха-ха, ну ты юморист Улыбка)))))))))))
PHP:
скопировать код в буфер обмена
  1. for ($i=0;$i<$base;$i++)
  2. {
  3. $zapros = "SELECT * from `demo` WHERE test=$test";
  4. $result=mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');
  5. if (!mysql_num_rows($result))
  6. {
  7. $zapros = "insert into `demo` (test, teni, opisanie, dopinfo, visual) VALUES ('$test', '$teni', '$opisanies', '$dopinfos', '$visual')
  8. ON DUPLICATE KEY UPDATE
  9. `teni`=VALUES(`teni`)";
  10. $result = mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');
  11. }
 
 Top
evgenijj
Отправлено: 03 Января, 2008 - 22:35:15
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. for ($i=0;$i<$base;$i++)
  3. {
  4.   $zapros = "INSERT INTO `demo` (test, teni, opisanie, dopinfo, visual)
  5.             VALUES ('$test', '$teni', '$opisanies', '$dopinfos', '$visual')
  6.             ON DUPLICATE KEY UPDATE teni='$teni'";
  7.   $result = mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');
  8. }
  9.  

Или так
PHP:
скопировать код в буфер обмена
  1.  
  2. for ($i=0;$i<$base;$i++)
  3. {
  4.   $zapros = "INSERT INTO `demo` (`test`, `teni`, `opisanie`, `dopinfo`, `visual`)
  5.             VALUES ('$test', '$teni', '$opisanies', '$dopinfos', '$visual')
  6.             ON DUPLICATE KEY UPDATE `teni`='$teni'  
  7.             `teni`=VALUES(`teni`)";
  8.   $result = mysql_query($zapros, $soedinenie) or die('Не могу сделать запрос к базе данных');
  9. }
  10.  

А потом расскажи, что получилось.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB