2011-01-24 18 views
5

Potrzebuję pomocy dotyczącej metody wstawiania wartości do pojedynczej kolumny w różnych wierszach.SQL - Wstawianie wartości wielu wierszy do pojedynczej kolumny

Teraz mam implodowała tablicę, która daje mi wartości takich jak to:

('12', '13', '14')

Liczby te są nowe identyfikatory, które chcę wstawić do DB.
Kod kiedyś implozji macierz jest to,

$ wielofunkcyjna = "('" .implode (" ''"., $ Box) "')"; // Gdzie $ skrzynka jest początkową tablicę

Zapytanie których mam zamiar używać utknie tu:

mysql_query (”INSERT INTO studentcoursedetails (studentID) WARTOŚCI

Jedną opcją byłoby powtórzenie tego, ale nie mogę, ponieważ tablica będzie w pętli, mogą być 3 identyfikatory, może być 20.
Pętla nie wydaje się właściwa. Każda pomoc będzie doceniona.

+1

Powinieneś użyć pętli i _normalized_ bazy danych. Kolumna zawierająca wiele wartości nie jest znormalizowana. – Oded

+0

Pętla jest dokładnie taka, jak powinieneś to rozwiązać, zobacz http://php.net/manual/en/control-structures.foreach.php – Andomar

Odpowiedz

3

Na wstawienie więcej niż jedną wartość do tabeli należy użyć (wartość1), (value2) składnia:

$combi = "('".implode("'), ('",$box)."')"; 

PS: Ta funkcja nazywa wartość rzędu konstruktorzy i jest dostępny od SQL-92

+2

Czy Oracle zakończyło implementację SQL-92? Wartości obsługiwane przez serwer SQL (..), (..) dopiero od 2008 roku – RichardTheKiwi

+0

Nie myśl, że dodaliby do tego nową składnię. Są już dwa sposoby zrobienia tego w oracle, które znalazłem tutaj: http://stackoverflow.com/questions/883706/inserting-multiple-rows-into-oracle – meze

2

Czy nie można zrobić coś takiego:

for($x = 0; $x < count($box); $x++) 
{ 
    mysql_query("INSERT INTO studentcoursedetails (studentID) VALUES ($box[$x]); 
} 

To będzie działać bezpośrednio na swojej tablicy, wstawić nowy wiersz dla każdej wartości w $ polu, a także zapobiec konieczności implodować tablicę do rozdzielany przecinkami string

Składowanie identyfikatorów jako łańcucha rozdzielanego przecinkami może początkowo wydawać się prostym modelem, ale w dłuższej perspektywie spowoduje to problemy z próbą pracy z nie znormalizowaną bazą danych.

+0

W rzeczywistości sugestia z cyberkiwi jest lepsza, ponieważ wymaga to tylko 1 wywołania DB, podczas gdy moje wymagałoby jednak wiele wartości znajduje się w tablicy. Oba osiągają dokładnie to samo, ale rozwiązanie cyberkiwis spowodowałoby mniejsze obciążenie zarówno w PHP, jak i MySQL. – MrEyes

1

Nadal można utworzyć instrukcję za pośrednictwem implodu. Po prostu nie używaj WARTOŚCI; zamiast tego użyj SELECT:

$combi = " ".implode(" UNION ALL SELECT ",$box)." "; // Where $box is the initial array 
mysql_query("INSERT INTO studentcoursedetails (studentID) SELECT " . $combi) 

Urządzenie SELECT .. union jest przenośne dla wielu systemów DBMS.

Uwaga na temat identyfikatorów - jeśli są to liczby, nie podawaj ich.

0

Sprawdź, czy istnieje wariant funkcji mysql_query, która będzie działać na parametrze tablicy.

2

Niektóre smaki SQL pozwalają wkładki złożonych:

insert into studentcoursedetails (studentid) values 
    (1), 
    (2), 
    (3), 
2

Jeśli używasz MySQL, można wstawić wiele wartości w jednym zdaniu:

sql> insert into studentcoursedetails (studentID) 
    > values (('12'), ('13'), ('14')); 

Więc wystarczy budowie ten ciąg w PHP i gotowe.

Powiązane problemy