Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Chèn vào nhiều bảng? (Chuẩn hóa cơ sở dữ liệu?)

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:

  1. 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:

  2. 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, ...);
    
  3. 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ụng mysql_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 BEGINCOMMIT tại đây.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tạo một chỉ mục vào phần ngày của trường DATETIME trong MySql

  2. Cách phát hiện xem một giá trị có chứa ít nhất một chữ số trong MySQL hay không

  3. MySQL REPLACE () - Thay thế tất cả các phiên bản của một chuỗi con bằng một chuỗi khác

  4. Câu lệnh chuẩn bị sẵn trong PHP PDO - Truy vấn LIKE trong MySQL

  5. Sử dụng MariaDB