Вставка с использованием LEFT JOIN и 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;
Мой запрос INSERT
пока таков:
INSERT INTO user
SELECT *
FROM user
LEFT JOIN user_permission AS userPerm ON user.id = userPerm.user_id;
Однако я не уверен, как сделать VALUE('','','','', etc etc)
При использовании левого и внутреннего соединения.
Итак, что я хочу сделать, это:
Таблица User
:
id | name | username | password | OptIn
--------------------------------------------------------------------
562 Bob Barker bBarker [email protected] 1
А также таблица user_permission
user_id | Permission_id
-------------------------
562 4
ОБНОВЛЕНИЕ Так как это?
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);
Ответы
Ответ 1
Вы должны быть конкретными о столбцах, которые вы выбираете. Если в таблице user
было четыре столбца id, name, username, opted_in
, вы должны выбрать именно те четыре столбца из запроса. Синтаксис выглядит так:
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
Однако, по-видимому, нет никаких оснований присоединяться к user_permission
здесь, так как ни один из столбцов из этой таблицы не будет вставлен в user
. На самом деле, этот INSERT
, похоже, не работает с нарушениями уникальности первичного ключа.
MySQL не поддерживает вставки в несколько таблиц одновременно. Вам либо нужно выполнить два оператора INSERT
в вашем коде, используя последний идентификатор вставки из первого запроса, либо создать триггер AFTER INSERT
в первичной таблице.
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)
Или используя 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
Ответ 2
вы не можете использовать предложение VALUES
при вставке данных с помощью другого запроса SELECT
. см. 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
);
Ответ 3
INSERT INTO Test([col1],[col2]) (SELECT a.Name AS [col1],b.sub AS [col2] FROM IdTable b INNER JOIN Nametable a ON b.no = a.no)