2012-08-22 95 views
27

Hey tất cả tôi đang cố gắng tìm hiểu làm thế nào để đi về chèn một kỷ lục mới bằng cách sử dụng chuỗi truy vấn sau đây trong VB.net:Chèn sử dụng LEFT JOIN và INNER JOIN

SELECT user.id, user.name, user.username, user.email, 
    IF(user.opted_in = 0, 'NO', 'YES') AS optedIn 
FROM 
    user 
    LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id 
ORDER BY user.id; 

truy vấn INSERT tôi cho đến nay là thế này:

INSERT INTO user 
SELECT * 
FROM user 
    LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id; 

Tuy nhiên, tôi không chắc chắn cách thực hiện VALUE('','','','', etc etc) khi sử dụng kết nối trái và bên trong.

Vì vậy, những gì tôi đang tìm cách để làm điều này là:

User bảng:

id | name  | username | password     | OptIn 
-------------------------------------------------------------------- 
562  Bob Barker bBarker  [email protected] 1 

Và cũng là user_permission bảng

user_id | Permission_id 
------------------------- 
562   4 

CẬP NHẬT Vì vậy, như thế này?

INSERT INTO user (name, username, password, email, opted_in) VALUES ('Bbarker','Bbarker','blahblahblah','[email protected]',0); 
INSERT INTO user_permission (user_id, permission_id) VALUES (LAST_INSERT_ID(),4); 
+0

Tại sao bạn chèn vào 'người dùng' khi bạn vừa chọn giá trị từ' người dùng'? Bạn đang định chèn hàng mới nào? –

Trả lời

29

Bạn phải cụ thể về các cột bạn đang chọn. Nếu bảng user của bạn có bốn cột id, name, username, opted_in, bạn phải chọn chính xác bốn cột đó từ truy vấn. Cú pháp trông giống như:

INSERT INTO user (id, name, username, opted_in) 
    SELECT id, name, username, opted_in 
    FROM user LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id 

Tuy nhiên, có không xuất hiện để có lý do nào để tham gia chống lại user_permission ở đây, vì không ai trong số các cột từ bảng đó sẽ được chèn vào user. Trong thực tế, điều này INSERT dường như bị ràng buộc để thất bại với các vi phạm chính độc đáo chính.

MySQL không hỗ trợ chèn nhiều bảng cùng một lúc. Bạn cần thực hiện hai câu lệnh INSERT trong mã của mình, sử dụng id chèn cuối cùng từ truy vấn đầu tiên hoặc tạo kích hoạt AFTER INSERT trên bảng chính.

INSERT INTO user (name, username, email, opted_in) VALUES ('a','b','c',0); 
/* Gets the id of the new row and inserts into the other table */ 
INSERT INTO user_permission (user_id, permission_id) VALUES (LAST_INSERT_ID(), 4) 

Hoặc sử dụng một trigger:

CREATE TRIGGER creat_perms AFTER INSERT ON `user` 
FOR EACH ROW 
BEGIN 
    INSERT INTO user_permission (user_id, permission_id) VALUES (NEW.id, 4) 
END 
+0

Tôi cần chèn một hàng trong bảng user_permission cũng như bên cạnh bảng người dùng. Làm thế nào tôi sẽ làm điều đó? – StealthRT

+0

Cập nhật OP của tôi để giải thích rõ hơn những gì tôi đang tìm kiếm. – StealthRT

+0

@StealthRT Bạn không thể chèn các hàng mới vào 2 bảng mà không có nhiều câu lệnh hoặc kích hoạt trên bảng đầu tiên. –

15

bạn không thể sử dụng VALUES khoản khi chèn dữ liệu sử dụng một truy vấn SELECT. xem INSERT SYNTAX

INSERT INTO user 
(
id, name, username, email, opted_in 
) 
(
    SELECT id, name, username, email, opted_in 
    FROM user 
     LEFT JOIN user_permission AS userPerm 
      ON user.id = userPerm.user_id 
); 
+0

Cảm ơn bạn đã dành thời gian trả lời bằng câu trả lời, Omesh! – StealthRT