Aktualizacja wielu rekordów naraz w MySQL


(northwest) #1

Witam serdecznie,

mam 2 tabelki w MySQL:

CREATE TABLE IF NOT EXISTS `cms_temer` (
  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `nazwa` int(11) NOT NULL,
  `ilosc` int(11) NOT NULL,
  PRIMARY KEY (`nazwa`),
  UNIQUE KEY `id` (`bf_id`),
  UNIQUE KEY `nazwa` (`nazwa`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `cms_produkty` (
  `bf_id` bigint(35) unsigned NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(455) COLLATE utf8_unicode_ci DEFAULT NULL,
  `obrazek` varchar(400) COLLATE utf8_unicode_ci DEFAULT NULL,
  `isbn` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `kategoria` int(11) DEFAULT NULL,
  `podkategoria` int(11) DEFAULT NULL,
  `podgrupa` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ate` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ilosc` int(11) DEFAULT '1',
  UNIQUE KEY `id` (`bf_id`),
  UNIQUE KEY `isbn` (`isbn`),
  KEY `nazwa` (`nazwa`(333)),
  KEY `podkategoria` (`podkategoria`),
  KEY `kategoria` (`kategoria`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

W tabeli cms_produkty mam różnego rodzaju produkty (ok 200 tys). W tabeli cms_temer - mam codziennie aktualizowane stany.

 

Opis tabeli cms_temer:

nazwa = cms_produkty.ate

ilość = cms_produkty.ilosc

 

Muszę na podstawie tabeli cms_temer przeprowadzić aktualizację produktów w tabeli cms_produkty

 

Próbuję rozwiązać tą aktualizację za pomocą skryptu:

$update1 = null;
			$update2 = null;
			$update3 = null;
			$iillee = 0;
			$update = null;
			$wynik = mysql_query(" SELECT * FROM cms_temer ;") or die('Query failed: ' . mysql_error());
			while($rek = mysql_fetch_array($wynik)) { 
				if($iillee < 200) {
					$update .= " UPDATE cms_produkty2 SET ilosc = '$rek[ilosc]' WHERE ate = '$rek[nazwa]'; ";
					$update1 .= " WHEN $rek[nazwa] THEN '$rek[ilosc]' ";
					$update2 .= " $rek[nazwa], ";
					$update3 .= 
					$iillee = $iillee + 1;
				}
				if($iillee == 200){
				$update2 = substr($update2, 0, -3);
					$qqqqqq = "UPDATE cms_produkty2 SET ilosc = CASE ate
						 $update1
						 ELSE ilosc END
						WHERE ate IN ($update2);
					";
					mysql_query($qqqqqq);
					$update1 = null;
					$update2 = null;
					$update3 = null;
					$iillee = 0;
				}
			}

Problem w tym że nie wszystkie rekordy zawsze mi się aktualizują.... Część produktów ma zmieniony stan - a część nie... Ma ktoś może pomysł jak to naprawić?

 

Bardzo proszę o pomoc,

Northwest


(Grzelix) #2

Najpierw doprowadź kod do stanu, kiedy będzie on zrozumiały dla nich. Pomimo szczerych chęci, to nie jestem stanie zrozumieć co ta aktualizacja ma zrobić.

 

Po za tym:

  1. Jaką strukturę ma tabela   cms_produkty2 którą aktualizujesz.

  2. Jakie znaczenie ma wartość 200?

3 Może zrób procedurę składowaną zamiast przeliczania tego silnikiem php


(northwest) #3

w opisie zapomniałem "2" - przepraszam


(GioWDS) #4

A nie prościej mergować te dwie tabele w jedną tymczasową,a wtedy wrzucać w orginalną?


(Grzelix) #5

Jak dla mnie to rozwiązanie wygląda tak:

update cms_produkty2 p
inner join cms_temer t on
    t.nazwa = p.ate
set p.ilosc = s.ilosc

Możesz to zapakować do procedury składowanej albo wywołać zapytanie  z php (jak wolisz)

 

albo jako event w MySQL

CREATE EVENT updateProductsEvent
    ON SCHEDULE
      EVERY 40 MINUTES
    DO
      BEGIN
		update cms_produkty2 p
		inner join cms_temer t on
			t.nazwa = p.ate
		set p.ilosc = s.ilosc
	END