插入3个连接MYSQL

时间:2017-02-16 00:09:19

标签: mysql

我要做的是通过加入将多个表中的记录插入到1个表中。这就是我所拥有的,而我似乎无法让它发挥作用。我收到以下错误#1136 - 列数与第1行的值计数不匹配

INSERT INTO users(`name`, `email`,`location_id`, `department_id`)
VALUES('John Doe', 'jdoe@email.com', 1, 1)

INSERT INTO extensions(`ext`)
VALUES(98765)

INSERT INTO dids(`did`)
VALUES('1-800-555-5555')

INSERT INTO users_numbers(user_id,ext_id,did_id) 
SELECT extensions.*, dids.*, users.*
FROM extensions tbl_ext, dids tbl_dids, users tbl_users, users_numbers usn
Inner Join users ON users.id=usn.user_id 
Inner Join extensions ON extensions.id=usn.ext_id 
Inner Join dids ON dids.id=usn.did_id
WHERE tbl_users.name = 'John Doe' 
AND tbl_users.email = 'jdoe@email.com' 
AND tbl_ext.ext = 98765 
AND tbl_dids.did='401-559-9999';

前3个插入语句有效。当我尝试加入时,错误在4插入时触发。任何人都可以提供帮助。

3 个答案:

答案 0 :(得分:1)

使用LAST_INSERT_ID()

INSERT INTO users(`name`, `email`,`location_id`, `department_id`)
VALUES('John Doe', 'jdoe@email.com', 1, 1);

SET @user_id = LAST_INSERT_ID();

INSERT INTO extensions(`ext`)
VALUES(98765);

SET @ext_id = LAST_INSERT_ID();

INSERT INTO dids(`did`)
VALUES('1-800-555-5555');

SET @did_id = LAST_INSERT_ID();

INSERT INTO users_numbers(user_id,ext_id,did_id)
VALUES (@user_id,@ext_id,@did_id);

您也可以使用应用语言中的@user_id,@ext_id,@did_id取代用户变量(LAST_INSERT_ID)。

答案 1 :(得分:0)

您需要非常具体地了解您希望从SELECT添加哪些列。现在你抓住了三张牌桌上的所有东西,这太过分了。

也许你的意思是:

INSERT INTO users_numbers(user_id,ext_id,did_id)
  SELECT users.id, extensions.id, dids.id
    FROM ...

在编写像这样的复杂查询时,分别运行SELECT子组件以确保它生成正确的数据。我打赌,如果你运行你的版本它会显示一堆列。

答案 2 :(得分:0)

有两个问题。

首先,SELECT列表必须只返回要插入表中的列。错误是因为您要返回tablename.*而不是特定列。

其次,SELECT查询非常错误。您将要加入的表格列出两次:首先在FROM子句中,然后再在INNER JOIN子句中。你应该只列出一次(除非你正在进行自我加入,这里不需要)。

您不应该加入users_numbers - 这是您要添加的表格,因此它还没有这些行的ID。

您想要的是每个源表中的行之间的简单交叉连接,这些行与您要组合到关系表中的值相匹配。

INSERT INTO users_numbers(user_id,ext_id,did_id) 
SELECT u.id, e.id, d.id
FROM users AS u
CROSS JOIN extensions AS e
CROSS JOIN dids AS d
WHERE u.name = 'John Doe' 
AND u.email = 'jdoe@email.com' 
AND e.ext = 98765 
AND d.did='401-559-9999';