Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [podstawy] dodawanie kilku alementów w jednym zapytaniu
flashdev
post
Post #1





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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?

Ten post edytował flashdev 17.01.2010, 01:07:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
hddkill
post
Post #2





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 15.01.2010

Ostrzeżenie: (0%)
-----


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..
Go to the top of the page
+Quote Post
flashdev
post
Post #3





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.

Ten post edytował flashdev 17.01.2010, 13:19:42
Go to the top of the page
+Quote Post
hddkill
post
Post #4





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 15.01.2010

Ostrzeżenie: (0%)
-----


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..
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 20:00