Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [podstawy] dodawanie kilku alementów w jednym zapytaniu
Forum PHP.pl > Forum > Bazy danych > MySQL
flashdev
Witam!

Napisałem poniższy kod, który tworzy fragment zapytania sql dodającego kilka wpisów do tabeli w jednym zapytaniu.

  1. $str = '';
  2. $count = count($arr);
  3. for( $i = 0; $i < $count; $i++ ){
  4. $str .= "(NULL, '". $arr[$i] ."', 0), ";
  5. }


I teraz pojawił się problem. W tabeli drugie pole ma status UNIQUE. Kiedy jedna z wartości w tablicy $arr juz znajduje się w tabeli, to zapytanie wogóle się nie wykona i nie doda się żaden inny element, pomimo iż nie ma takiego w bazie.
Czy muszę to rozbijać na pojedyńcze zapytania? Da się jakoś inaczej?
hddkill
Cytat(flashdev @ 17.01.2010, 01:06:29 ) *
Witam!

Napisałem poniższy kod, który tworzy fragment zapytania sql dodającego kilka wpisów do tabeli w jednym zapytaniu.

  1. $str = '';
  2. $count = count($arr);
  3. for( $i = 0; $i < $count; $i++ ){
  4. $str .= "(NULL, '". $arr[$i] ."', 0), ";
  5. }


I teraz pojawił się problem. W tabeli drugie pole ma status UNIQUE. Kiedy jedna z wartości w tablicy $arr juz znajduje się w tabeli, to zapytanie wogóle się nie wykona i nie doda się żaden inny element, pomimo iż nie ma takiego w bazie.
Czy muszę to rozbijać na pojedyńcze zapytania? Da się jakoś inaczej?


a jakbys wykasował jednoznaczność indeksu, a sprawdzał po pętli czy są wpisy z duplikatem ? np.
CODE
$query1 = "ALTER IGNORE TABLE nazwa_tablicy ADD UNIQUE INDEX nazwa_kolumny";
$query2 = "ALTER TABLE nazwa_tablicy DROP INDEX nazwa_kolumny";
$result1 = mysql_query($query1, db) or die("Błąd: " . mysql_error());
$result2 = mysql_query($query2, db) or die("Błąd: " . mysql_error());

wtedy za każdym razem by sobie sprawdzał czy w tej kolumnie nie ma duplikatów, a pętla zapisze normalnie bo indeks jest dodawany i usuwany zaraz po petli..
Niewiem czy o to by ci chodziło..
flashdev
Nie do końca rozumiem o co chodzi.

Tymczasowo napisałem taki kod:
  1. $arr = (array)$arr;
  2. $res = array();
  3. $count = count($arr);
  4. for( $i = 0; $i < $count; $i++ ){
  5. $sql = "INSERT INTO `tags` (`id`, `tag_pl`, `tag`) VALUES (NULL, '". $arr[$i] ."', '". $this -> replacePlChars($arr[$i]) ."');";
  6. $res[$i] = $this -> sql -> query($sql) ? $this -> sql -> lastId() : 0;
  7. }
  8. return $res;

wejście: tablica zawierająca tagi do dodania
wyjscie: tablica zawierająca id dodanego tagu, lub 0 jeśli nie został dodany

No i to działa tak jak trzeba, tylko wydaje mi się, że da się to zrobić wykonujac tylko jedno zapytanie. Chyba o to chodzi w mysql, żeby wywoływać optymalne zapytania?
Jeśli da się to poprawić to czekam na sugestie.
hddkill
aha, teraz mi troche bardziej rozjasniles zadanie... wiadomo, ze zapytanie nie wykona sie jesli w danej kolumnie(oznaczej unique index) jest już taka sama wartość. Na początku myślałem, że ogólnie chcesz się pozbyć duplikatów więc dlatego chciałem byś wykasował unique index z tej kolumny i poprzez kod go dodawał i usuwał wtedy duplikaty usunełyby sie..
Teraz widze, że użyłeś klasy i w sumie też szybki sposób... Niestety nie wiem czy dałoby się w jednym zapytaniu to zrobić, sam jest ciekaw..
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.