我要做的是通过加入将多个表中的记录插入到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插入时触发。任何人都可以提供帮助。
答案 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';