【问题标题】:How to insert into table with values from another tables - mysql inner join如何将来自另一个表的值插入到表中 - mysql内部连接
【发布时间】:2019-05-21 05:46:30
【问题描述】:

在这种情况下,我创建了 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)

【问题讨论】:

  • 您的插入没有意义,因为这三个值总是相同的。一些示例数据在这里会很有帮助。
  • '可以通过内部连接插入“模块”表值' - 是的,但只有在模块中有一个条目可以连接时。我完全不清楚你想在这里做什么。
  • @P.Salmon 我想将值插入“模块”表中,但例如使用“项目”表中的值:而不是ID_PROJECT 我会尝试使用projects.PROJECT_NAME。为了清楚起见,我不想通过ID_PROJECT = 1 插入。我正在尝试projects.PROJECT_NAME = "BOX"
  • 即使模块中有条目,查询也会失败,因为您试图将字符列(Project_name)插入到 int(id_project)中。
  • 如果一列具有某种数据类型,那么它的外部数据类型具有微妙的不同就没有什么意义了。无论如何(幸运的是),INT 关键字后面括号中的数字几乎完全没有意义,应该省略。

标签: mysql inner-join sql-insert insert-into


【解决方案1】:

1) 你的第一个查询不正确,尤其是这部分INSERT INTO modules (ID_MODULE, NAME, --> projects.PROJECT_NAME)。您不能从另一个不同的表中定义与要插入的表不同的列。

2) 您的第二个查询是正确的。但是,如果根据此处的示例,将不会插入任何数据,因为您的查询使用为空的 modules 表执行 INNER JOIN。您可以尝试插入而不使用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_PROJECTint(11)。基本上,当您查看modules.ID_PROJECT 中插入的数据时,您将看到0(或者可能是NULL)而不是projects.PROJECT_NAME = 'BOX' 中的原始值。因此,您需要确保您的列数据类型匹配以保留原始数据。

【讨论】:

  • 我已经测试了第二个查询,它有一个错误:#1452 - Cannot add or update a child row: a foreign key constraint fails (project1.modules, CONSTRAINT modules_ibfk_1` FOREIGN KEY (ID_PROJECT) REFERENCES project (ID) )` 很抱歉忘记添加外键。
  • 哪个查询 @Prochu1991 ?
  • 你写的第二个:INSERT INTO modules (ID_MODULE, NAME, ID_PROJECT) SELECT 1, 'S-BOX', projects.PROJECT_NAME FROM projects WHERE projects.PROJECT_NAME='BOX';
  • 看看stackoverflow.com/questions/4775520/… ..看看有没有帮助:)
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2020-04-17
  • 2020-05-29
  • 2021-11-17
  • 2023-03-29
相关资源
最近更新 更多