如何将其他表中的值插入到表中-mysql内部联接

如何将其他表中的值插入到表中-mysql内部联接,mysql,inner-join,sql-insert,insert-into,Mysql,Inner Join,Sql Insert,Insert Into,在本例中,我创建了两个表: 项目: 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, P

在本例中,我创建了两个表:

项目:

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')
现在我想将数据插入到“modules”表中,但不使用ID_项目。我想从“项目”表中插入项目名称。当我尝试使用以下命令时:

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';
它并没有显示任何错误,但并没有向“modules”表插入任何行记录

我有一个问题,是否可以在“模块”表的值中插入另一个内部联接表(内部联接“项目”表)?如果是,告诉我该怎么做。谢谢你的帮助

例如:

在“模块”表中,我没有插入任何内容。但要插入数据:

ID_MODULE = 1
NAME = "S-BOX"
projects.PROJECT_NAME = "BOX" (which is inner joined on modules.ID_PROJECT = projects.ID)
1) 您的第一个查询不正确,尤其是此部分
插入模块(ID\u模块,名称,-->projects.PROJECT\u名称)
。您不能从另一个表中定义另一列,而不是要插入的表

2) 你的第二个问题是正确的。但是,如果根据这里的示例,由于查询使用空的
modules
表进行
internaljoin
,因此不会插入任何数据。您可以在不执行
内部联接的情况下尝试插入,如下所示:

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\u NAME
的列数据类型,它是
varchar(50)
但是
modules.ID\u PROJECT
它是
int(11)
。基本上,当您查看
modules.ID\u PROJECT
中插入的数据时,您将看到
0
(或者
NULL
)而不是
projects.PROJECT\u NAME='BOX'
中的原始值。因此,您需要确保列数据类型匹配以保留原始数据。

插入没有意义,因为这三个值总是相同的。一些示例数据在这里真的很有用。“可以使用内部联接将值插入到“modules”表中”-是的,但只有在模块中有要联接的条目时才可以。我一点也不清楚您想在这里做什么。@P.Salmon我想在“模块”表中插入值,但使用“项目”表中的值,例如:通过
ID\u PROJECT
我会尝试使用
projects.PROJECT\u NAME
。为了清楚起见,我不希望通过
ID\u PROJECT=1
插入。我试着像
projects.PROJECT\u NAME=“BOX”
一样,即使模块中有一个条目,查询也会失败,因为您试图将字符列(PROJECT\u NAME)插入int(id\u PROJECT)中。如果一个列具有特定的数据类型,那么它的外部数据类型有细微的不同是没有意义的。在任何情况下(幸运的是),INT关键字后面括号中的数字几乎完全没有意义,应该省略。我已经测试了第二个查询,它有一个错误:
#1452-无法添加或更新子行:外键约束失败(
project1
modules
,constraint
modules\u ibfk\u 1`外键(
ID\u PROJECT
)引用
PROJECT
ID
)`我很抱歉忘记添加外键。哪个查询@Prochu1991?您编写的第二个查询:
插入模块(ID\u模块、名称、ID\u项目)选择1,“S-BOX”,projects.PROJECT_NAME FROM projects WHERE projects.PROJECT_NAME='BOX';
查看..看看是否有帮助:)