Không, bạn không thể chèn vào nhiều bảng trong một lệnh MySQL. Tuy nhiên, bạn có thể sử dụng các giao dịch.
BEGIN;
INSERT INTO users (username, password)
VALUES('test', 'test');
INSERT INTO profiles (userid, bio, homepage)
VALUES(LAST_INSERT_ID(),'Hello world!', 'http://www.stackoverflow.com');
COMMIT;
Hãy xem LAST_INSERT_ID()
để sử dụng lại các giá trị tự động tăng thêm.
Bạn đã nói " Sau tất cả thời gian cố gắng tìm ra nó, nó vẫn không hoạt động. Tôi không thể chỉ cần đặt ID vừa tạo trong $ var và đặt $ var đó trong tất cả các lệnh MySQL? "
Hãy để tôi nói rõ hơn:có 3 cách khả thi ở đây:
-
Trong đoạn mã bạn thấy ở trên. Điều này làm được tất cả trong MySQL và
LAST_INSERT_ID()
trong câu lệnh thứ hai sẽ tự động là giá trị của cột autoincrement đã được chèn vào câu lệnh đầu tiên.Thật không may, khi chính câu lệnh thứ hai chèn các hàng trong bảng có cột tăng tự động, thì
LAST_INSERT_ID()
sẽ được cập nhật vào bảng 2, chứ không phải bảng 1. Nếu bạn vẫn cần bảng 1 sau đó, chúng tôi sẽ phải lưu trữ nó trong một biến. Điều này dẫn chúng ta đến cách 2 và 3: -
Sẽ lưu trữ
LAST_INSERT_ID()
biến ina MySQL:INSERT ... SELECT LAST_INSERT_ID() INTO @mysql_variable_here; INSERT INTO table2 (@mysql_variable_here, ...); INSERT INTO table3 (@mysql_variable_here, ...);
-
Sẽ lưu trữ
LAST_INSERT_ID()
trong biến aphp (hoặc bất kỳ ngôn ngữ nào có thể kết nối với cơ sở dữ liệu của yourchoice):-
INSERT ...
- Sử dụng ngôn ngữ của bạn để truy xuất
LAST_INSERT_ID()
, bằng cách thực thi câu lệnh theo nghĩa đen đó trong MySQL hoặc sử dụngmysql_insert_id()
của php ví dụ cái nào làm được điều đó cho bạn -
INSERT [use your php variable here]
-
CẢNH BÁO
Dù bạn chọn cách giải quyết vấn đề này là gì, bạn phải quyết định điều gì sẽ xảy ra nếu quá trình thực thi bị gián đoạn giữa các truy vấn (ví dụ:máy chủ cơ sở dữ liệu của bạn bị treo). Nếu bạn có thể sống với "một số đã hoàn thành, một số khác thì không", đừng đọc tiếp.
Tuy nhiên, nếu bạn quyết định "hoặc tất cả các truy vấn kết thúc hoặc không kết thúc - Tôi không muốn các hàng trong một số bảng nhưng không có hàng nào phù hợp trong các bảng khác, tôi luôn muốn các bảng cơ sở dữ liệu của mình nhất quán", bạn cần phải kết hợp tất cả các câu lệnh trong một giao dịch . Đó là lý do tại sao tôi sử dụng BEGIN
và COMMIT
tại đây.