Как вставить в таблицу со значениями из других таблиц - mysql inner join - PullRequest
0 голосов
/ 21 мая 2019

В этом случае я создал 2 таблицы:

Проекты:

CREATE TABLE projects (
ID int(5) NOT NULL,
PROJECT_NAME varchar(50) NOT NULL
);

Модули:

CREATE TABLE modules (
ID_MODULE int(11) NOT NULL,
NAME varchar(50),
ID_PROJECT int(11) DEFAULT NULL
);

Я вставил данные в таблицу проектов:

INSERT INTO projects (ID, PROJECT_NAME) VALUES
(1, 'BOX'),
(2, 'Duck')

Теперь я хотел бы вставить данные в таблицу «модулей», но не с помощью ID_PROJECT. Я хочу вставить с PROJECT_NAME из таблицы "проектов". Когда я попробовал с приведенной ниже командой:

INSERT INTO modules (ID_MODULE, NAME, projects.PROJECT_NAME)
SELECT 1, 'S-BOX', projects.PROJECT_NAME
FROM modules INNER JOIN projects
ON modules.ID_PROJECT = projects.ID AND projects.PROJECT_NAME = 'BOX';

Это показывает ошибку:

1054 - Неизвестный столбец 'projects.PROJECT_NAME' в списке полей

Но когда я написал так:

INSERT INTO modules (ID_MODULE, NAME, ID_PROJECT)
SELECT 1, 'S-BOX', projects.PROJECT_NAME
FROM modules INNER JOIN projects
ON modules.ID_PROJECT = projects.ID AND projects.PROJECT_NAME = 'BOX';

Это не показывало никакой ошибки, но оно не вставляло ни одной записи строки в таблицу «модулей».

У меня есть вопрос: можно ли вставить в таблицу значений "модули" внутреннее соединение с другой таблицей (внутреннее объединение "проекты")? Если да, скажи, что мне делать. Спасибо за любую помощь.

Например:

В таблицу "модули" я ничего не вставил. Но хочу вставить данные:

ID_MODULE = 1
NAME = "S-BOX"
projects.PROJECT_NAME = "BOX" (which is inner joined on modules.ID_PROJECT = projects.ID)

1 Ответ

1 голос
/ 21 мая 2019

1) Ваш первый запрос неверен, особенно эта часть INSERT INTO modules (ID_MODULE, NAME, --> projects.PROJECT_NAME).Вы не можете определить другой столбец из другой таблицы, отличной от той, в которую вы хотите вставить.

2) Ваш второй запрос правильный.Однако, если в соответствии с приведенным здесь примером данные не будут вставлены, так как ваш запрос делает INNER JOIN с пустой таблицей modules.Вы можете попробовать вставить без выполнения INNER JOIN, как показано ниже:

INSERT INTO modules (ID_MODULE, NAME, ID_PROJECT)
SELECT 1, 'S-BOX', projects.PROJECT_NAME
FROM projects
WHERE projects.PROJECT_NAME='BOX';

Я считаю, что запрос выше будет работать, но вы увидите это сообщение:

Warning Code : 1265
Data truncated for column 'ID_PROJECT' at row 1

Потому что если вы посмотритев вашем типе столбца для projects.PROJECT_NAME это varchar(50), но modules.ID_PROJECT это int(11).По сути, когда вы смотрите на вставленные данные в modules.ID_PROJECT, вы увидите 0 (или, возможно, NULL) вместо исходного значения из projects.PROJECT_NAME = 'BOX'.Поэтому вам необходимо убедиться, что ваш тип данных столбца совпадает, чтобы сохранить исходные данные.

...