2011-01-24 68 views
5

Tôi cần trợ giúp về phương pháp chèn giá trị vào một cột trên các hàng khác nhau.SQL - Chèn nhiều giá trị hàng vào một cột đơn

Ngay bây giờ, tôi có một mảng nổ tung mà mang lại cho tôi một giá trị như thế này:

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

Những con số này là ID mới mà tôi muốn chèn vào DB.
Code tôi sử dụng để nổ tung mảng là thế này:

$ combi = "('.implode (" ''"., $ Hộp) "')"; // Trường hợp $ hộp là mảng ban đầu

Các truy vấn trong đó tôi có kế hoạch sử dụng bị mắc kẹt ở đây:

mysql_query (" INSERT INTOstudentcoursedetails (studentID) GIÁ TRỊ

Một tùy chọn sẽ là lặp lại điều này, nhưng tôi không thể, vì mảng sẽ lặp lại, có thể có 3 ID, có thể có 20.
Một vòng lặp dường như không đúng. Bất kỳ trợ giúp sẽ được đánh giá cao.

+1

Bạn nên sử dụng vòng lặp và cơ sở dữ liệu _normalized_. Cột chứa nhiều giá trị không được chuẩn hóa. – Oded

+0

Vòng lặp chính xác là cách bạn nên giải quyết vấn đề này, xem http://php.net/manual/en/control-structures.foreach.php – Andomar

Trả lời

3

Để chèn nhiều hơn một giá trị vào một bảng bạn nên sử dụng (value1), (value2) Cú pháp:

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

PS: Tính năng này được gọi là nhà xây dựng giá trị hàng và có sẵn từ SQL-92

+2

Oracle đã hoàn thành triển khai SQL-92 chưa? Các giá trị được hỗ trợ của SQL Server (..), (..) chỉ từ năm 2008 trở đi – RichardTheKiwi

+0

Đừng nghĩ rằng chúng sẽ thêm một cú pháp mới cho điều đó. Đã có hai cách để làm điều này trong oracle, mà tôi tìm thấy ở đây: http://stackoverflow.com/questions/883706/inserting-multiple-rows-into-oracle – meze

2

Bạn có thể không làm một cái gì đó như thế này:

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

này sẽ làm việc trực tiếp trên mảng của bạn, chèn một hàng mới cho mỗi giá trị trong $ hộp và cũng ngăn chặn sự cần thiết phải nổ tung mảng đến một dấu phẩy phân cách string

Lưu trữ id dưới dạng chuỗi được phân cách bằng dấu phẩy có thể ban đầu có vẻ như là một mô hình đơn giản nhưng trong thời gian dài điều này sẽ khiến bạn không gặp khó khăn khi cố gắng làm việc với cơ sở dữ liệu không chuẩn hóa.

+0

Thực ra, đề xuất từ ​​cyberkiwi tốt hơn vì điều này chỉ yêu cầu 1 cuộc gọi DB trong khi tôi yêu cầu tuy nhiên nhiều giá trị có trong mảng. Cả hai đều đạt được chính xác điều tương tự nhưng giải pháp cyberkiwis sẽ tạo ra ít tải hơn trong cả PHP và MySQL. – MrEyes

1

Bạn vẫn có thể tạo câu lệnh qua implode. Chỉ cần không sử dụng giá trị; sử dụng SELECT thay vì

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

SELECT .. union là di động trên nhiều dbms.

Lưu ý trên ID - nếu chúng là số, không báo giá chúng.

0

Kiểm tra xem có một biến thể của hàm mysql_query sẽ hoạt động trên tham số mảng hay không.

2

Một số hương vị của sql cho phép chèn hợp chất:

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

Nếu bạn đang sử dụng MySQL, bạn có thể chèn nhiều giá trị trong một câu duy nhất:

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

Vì vậy, bạn chỉ cần xây dựng chuỗi đó trong PHP và bạn đã hoàn tất.

Các vấn đề liên quan