2017-11-21 50 views
7

Tôi có hai cơ sở dữ liệu khác nhau, tên:Chọn dữ liệu từ bảng db 1 và chèn nó vào một bảng db 2 trong php

  1. dbtest: Bảng 1
  2. dbtest2: Bảng 2

Tôi muốn chọn tất cả dữ liệu và mục nhập mới từ dbtest Bảng 1 đến dbtest2 Bảng 2.

Tôi đã thử điều này

$sqlfin = "INSERT INTO dbtest2.Table2 SELECT * FROM dbtest.Table1"; 
$resultfi = mysqli_query($db_conn, $sqlfin); 

Nhưng không may mắn cho đến nay. Làm thế nào tôi có thể đảm bảo rằng Bản ghi mới được chèn vào cả hai bảng? Bất kỳ trợ giúp sẽ được đánh giá cao?

+3

có thể trùng lặp của [Chèn vào ... giá trị (SELECT ... FROM ...)] (https://stackoverflow.com/questions/25969/insert-into-values-select-from) –

+0

dường như truy vấn của bạn là tốt, bạn gặp phải lỗi gì trên truy vấn – AZinkey

+0

Truy vấn là chính xác. Hãy thử chạy truy vấn trong db trực tiếp.Nếu chèn xảy ra đúng thì một cái gì đó sai với mã php. Ngoài ra, hãy kiểm tra xem các giao dịch có được thực hiện trong db không nếu bạn không thể thấy dữ liệu. – kartik

Trả lời

5

phép thử nó ở định dạng này

INSERT INTO `dbtest2`.`Table2` SELECT * FROM `dbtest`.`Table1` 

Các điều kiện sau đây giữ cho INSERT ... câu SELECT:

  • Specify IGNORE lờ hàng có thể gây ra vi phạm trùng lặp-key.
  • cột AUTO_INCREMENT hoạt động như bình thường.
  • Để đảm bảo rằng nhật ký nhị phân có thể được sử dụng để tạo lại các bảng gốc, MySQL không cho phép chèn đồng thời cho INSERT ... SELECT câu lệnh (xem Section 8.11.3, “Concurrent Inserts”).
  • Để tránh các vấn đề tham chiếu cột mơ hồ khi SELECT và INSERT tham chiếu đến cùng một bảng, hãy cung cấp bí danh duy nhất cho mỗi bảng được sử dụng trong phần CHỌN, và các tên cột đủ điều kiện trong phần đó với bí danh thích hợp.

INSERT ... SELECT Syntax


Tạo Trigger: để thêm mục mới

CREATE TRIGGER copy_record BEFORE INSERT ON dbtest.Table1 
FOR EACH ROW 
BEGIN 
    INSERT INTO dbtest2.Table2 (first_name, last_name) VALUES (new.first_name, new.last_name); 
END 

trigger_event chỉ ra các loại hoạt động kích thích sự hình cò.Các giá trị trigger_event này được phép:

INSERT: The trigger activates whenever a new row is inserted into the table; for example, through INSERT, LOAD DATA, and REPLACE 

câu lệnh.

UPDATE: The trigger activates whenever a row is modified; for example, through UPDATE statements. 

DELETE: The trigger activates whenever a row is deleted from the table; for example, through DELETE and REPLACE statements. DROP TABLE 

và TRUNCATE TABLE báo cáo trên bàn không kích hoạt kích hoạt này, bởi vì họ không sử dụng DELETE. Việc bỏ phân vùng cũng không phải là kích hoạt trình kích hoạt DELETE.

CREATE TRIGGER Syntax

+0

Được rồi @AZinkey nó có ý nghĩa .. bây giờ vấn đề là nó không cập nhật các mục mới. Cảm ơn – Ashley

+0

mục mới có nghĩa là người dùng nhập .. Giống như những gì người dùng đăng nó sẽ đi đầu tiên đến db.Table1 và sau đó đi đến db.Table2 .. – Ashley

+0

idk tại sao nó không hoạt động, Bạn có thể xem điều này $ sqlfin = "TẠO TRIGGER copy_records SAU CH INSN TRÊN' dbtest'.'Table1' CHO MACHI ROW THEO D BEGINI BEGIN CHERTN vào 'dbtest2'.'Table2' END"; Tôi cũng thay đổi trigger_order thành PRECEDES .. – Ashley

0
INSERT INTO dbtest2 ( 
     id, 
     name, 
     status) 
SELECT id, 
     name,   
     '1' 
FROM dbtest 
ORDER BY id ASC 

Bạn có thể sử dụng cú pháp CHỌN INSERT ... Lưu ý rằng bạn có thể báo giá '1' trực tiếp trong phần CHỌN.

+0

Vui lòng kiểm tra liên kết https://stackoverflow.com/questions/14907863/insert-data-from-one-table-to-another-in-mysql –

+0

@Nims điều này hoạt động nhưng chỉ hoạt động khi có hai bảng trong cùng một db .. – Ashley

+0

btw Cảm ơn Nims, Alex và Tom – Ashley

1

Hãy thử truy vấn này cho nhiệm vụ của bạn mong muốn:

Query Đầu tiên(Create Table chính xác tương tự như trong cơ sở dữ liệu cũ, nếu bạn chưa có):

CREATE TABLE dbtest2.Table2 LIKE dbtest.Table1; 

Query Second(Chèn tất cả dữ liệu vào bảng mới được tạo):

INSERT INTO dbtest2.Table2 SELECT * FROM dbtest.Table1; 
+0

hy vọng trợ giúp này :) –

1

truy vấn của bạn có vẻ đúng nhưng sẽ thất bại nếu 2 bảng có cấu trúc khác nhau. Xác định các cột để tránh nó thích:

INSERT INTO dbtest2.Table2 (2_col_1, 2_col_2) SELECT 1_col_1, 1_col_2 FROM dbtest.Table1 


Với PDO (loại câu trả lời khác, tôi không biết nhiều cho mysqli):
Bạn có thể kết nối với Mysql với PDO không cung cấp tên cơ sở dữ liệu khi làm việc với nhiều tên (nhưng điều này không bắt buộc), như:

$db = new PDO("mysql:host=" . $host . ";", $user, $password, $options); 

Sau đó viết tên cơ sở dữ liệu, bảng và các cột như khi thực hiện một JOIN (như bạn đã làm): ngăn cách bởi một .

// an example .. 
$useDb = $db->query("INSERT INTO db_1.table1 (value_1, value_2) SELECT value_3, value_4 FROM db_2.table2 WHERE db_2.table2.id = 5"); 

(ví dụ kiểm tra và làm việc tốt)

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