2010-12-30 44 views
5

Tôi mới sử dụng MySQL, vì vậy hãy làm ơn :)MySQL - Cách chèn vào nhiều bảng có khóa ngoài

Tôi muốn chèn dữ liệu từ một biểu mẫu php vào 3 bảng khác nhau, tất cả đều có phím. Làm thế nào tôi có thể viết một lệnh chèn mà cập nhật tất cả 3 bảng cùng một lúc, bởi vì nếu tôi cố gắng để cập nhật một bảng bằng tay sau đó tôi nhận được một lỗi vì các tài liệu tham khảo bị thiếu. Tôi có phải xử lý các mục "NULL" và cập nhật mọi bảng khác hay có thể giải quyết điều này bằng một lệnh duy nhất không? Giống như MySQLi_Multi_Query?

Cảm ơn bạn rất nhiều!

+0

thể bạn xin vui lòng gửi phần có liên quan của giản đồ? –

Trả lời

5

Bạn có nhiều khả năng sẽ phải chèn mọi thứ theo thứ tự phụ thuộc của chúng. Vì vậy, nếu bạn có ba bảng (A, B và C), chúng tôi giả sử C phụ thuộc vào B và B phụ thuộc vào A. Chúng tôi cũng giả định mỗi bảng có khóa chính AID, BID và CID tương ứng.

  1. Bạn sẽ chèn hàng của mình vào A và nhận AID.
  2. Sau đó, bạn sẽ chèn hàng của mình vào B bằng AID bạn nhận được từ bước 1.
  3. Sau đó, bạn chèn hàng của mình vào C bằng cách sử dụng BID (và có lẽ AID) bạn nhận được từ bước 2 (và có thể 1))
+0

Cảm ơn bạn rất nhiều. Điều đó đã giúp rất nhiều. – Crayl

+0

Theo cách của bạn, chúng tôi phải thực hiện từng bước một, điều này có thể gây ra vấn đề về sự hoàn hảo. Có một giải pháp có thể chèn tất cả các hàng liên quan trong một sql? Bây giờ, tôi đang suy nghĩ, nếu tôi có thể nhận được một danh sách AID mà không chèn hàng ngay bây giờ? – oppo

+0

Bạn có thể nhìn vào chèn số lượng lớn với MySQL (Tôi chỉ có kinh nghiệm với nó trong MSSQL). Sau đó, bạn có thể bọc tất cả ba số lượng lớn chèn vào một giao dịch (vì vậy nếu một thất bại, tất cả được cuộn lại) –

21

Bạn có thể làm điều đó trong 3 phương pháp:

Trước & Đề xuất. SỬ DỤNG CHỌN TRONG GIÁ TRỊ INSERT:

INSERT INTO user (name) 
    VALUES ('John Smith'); 
INSERT INTO user_details (id, weight, height) 
    VALUES ((SELECT id FROM user WHERE name='John Smith'), 83, 185); 

thứ hai. SỬ DỤNG LAST_INSERT_ID TRONG GIÁ TRỊ GIÁ TRỊ:

INSERT INTO a (id) 
    VALUES ('anything'); 
INSERT INTO user_details (id, weight, height) 
    VALUES (LAST_INSERT_ID(),83, 185); 

Thứ ba. SỬ DỤNG PHP SCRIPT

<?php 
// Connecting to database 
$link = mysql_connect($wgScriptsDBServerIP, $wgScriptsDBServerUsername, $wgScriptsDBServerPassword, true); 
if(!$link || [email protected]_SELECT_db($wgScriptsDBName, $link)) { 
echo("Cant connect to server"); 
    exit; 
} 

// Values to insert 
$name = 'John Smith'; 
$weight = 83; 
$height = 185; 

// insertion to user table 
$sql = "INSERT INTO user (name) VALUES ('$name')"; 
$result = mysql_query($sql,$conn); 
// retrieve last id 
$user_id = mysql_insert_id($conn); 
mysql_free_result($result); 

// insertion to user_details table 
$sql = "INSERT INTO user_details (id, weight, height) VALUES ($user_id, $weight, $height)"; 
$result = mysql_query($sql,$conn); 
mysql_free_result($result); 
?> 
2

Có một lỗi trong cú pháp của bạn cho phương pháp 1.

INSERT INTO user_details (id, weight, height) 
    VALUES (SELECT(id FROM user WHERE name='John Smith'), 83, 185); 

nên

INSERT INTO user_details (id, weight, height) 
    VALUES ((SELECT id FROM user WHERE name='John Smith'), 83, 185); 
1

1) Ý nghĩa của foreign_key được kết hợp một giá trị trong một trường có giá trị trước tại một nơi khác. Vì vậy, bạn nên làm cho chèn của bạn theo thứ tự logic.

2) Nếu bạn muốn tránh những hạn chế hợp lý bạn nên

SET foreign_key_checks = 0 // disable key checks in server 
INSERT ... // any order 
INSERT ... 
... 
SET foreign_key_checks = 1 
Các vấn đề liên quan