#1146 - 表'database.table'与join不存在?

时间:2014-11-29 08:54:47

标签: mysql database join sql-update sql-insert

我一直在将数据从主数据库复制到测试数据库,因此当我需要在主数据库中的表之间移动列时,我可以熟悉它的工作原理。目前,我可以使用此查询INSERT新行没有问题。

INSERT INTO testDB.category_to_website (category_01_id)
SELECT t4.id
FROM testDB.websites t2
JOIN mainDB.websites t3 ON t2.url = t3.url
JOIN testDB.category_01 t4 ON t3.category2 = t4.name
WHERE t2.url = t3.url

但我无法为现有行提出等效的UPDATE查询。我正在尝试这个,但它不起作用。

UPDATE category_to_website
JOIN websites t2 ON t2.url = mainDB.websites.url
JOIN mainDB.websites t3 ON t2.url = t3.url
JOIN category_01 t4 ON t3.category2 = t4.name
SET t4.id=category_01_id
WHERE t2.url = t3.url

问题在于:mainDB.websites.url。我无法指定database.table.column,因为它会导致#1146 - Table 'mainDB.websites' doesn't exist。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:2)

此查询导致#1146 - Table 'mainDB.websites' doesn't exist错误的几个主要问题。

UPDATE category_to_website
JOIN websites t2 ON t2.url = mainDB.websites.url
JOIN mainDB.websites t3 ON t2.url = t3.url
JOIN category_01 t4 ON t3.category2 = t4.name
SET t4.id=category_01_id
WHERE t2.url = t3.url

问题#1:使用JOIN时,您必须确保您的标识符在范围内。

JOIN websites t2 ON t2.url = mainDB.websites.url

在查询的这一点上,我还没有加入mainDB.websites表,因此我无法将其用作标识符。

问题#2:您无法将别名与完全限定的表格引用/标识符混合使用。

请注意,testDB.websites现在是t2,因为我使用的是别名,我不能再使用database.table语法。

为了解决此问题,我必须将此JOIN中的标识符更改为testDB中的表格,因为查询的来源就是这样。我还必须删除别名或将它们用于所有表引用/标识符。一旦为表使用别名,MYSQL就会期望您完全使用它们。对于此示例,我们将删除别名。

UPDATE category_to_website
JOIN websites
ON websites.id = category_to_website.url_id
JOIN category
ON category.name = websites.category1
SET category_to_website.category01_id = category.id

另外,正如@philipxy指出的那样,WHERE子句也是多余的,不需要。这是MYSQL documentation,它解释了正确的语法。

答案 1 :(得分:0)

UPDATE     testDB.category_01 t4 
INNER JOIN mainDB.websites t3 ON t4.name = t3.name
INNER JOIN testDB.websites t2 ON t2.url = t3.url
INNER JOIN testDB.category_to_website t1 on t1.category_01_id = t3.id
SET        t4.category_to_website = category_01_id
WHERE      t2.url = t3.url

答案 2 :(得分:0)

UPDATE testDB.category_to_website t1
JOIN testDB.websites t2
JOIN mainDB.websites t3 ON t2.url = t3.url
JOIN testDB.category_01 t4 ON t3.category2 = t4.name
SET t1.category_01_id = t4.id

INSERT中的WHERE t2.url = t3.url是多余的。 FROM已创建一个概念性交叉连接,该连接仅限于t2.url = t3.url的行。在这个UPDATE中,WHERE t2.url = t3.url也是多余的。 SET发生在参与ON限制交叉连接的t1行中。这些是t2.url = t3.url。

的行

答案 3 :(得分:-1)

Update t4 set t4.id=t6.category_01_id from testDB.category_01 t4 as t4     
 inner join  testDB.websites t2 ON t2.url = mainDB.websites.url
 inner join mainDB.websites t3 ON t2.url = t3.url
inner join testDB.category_01 t5 ON t3.category2 = t5.name
 inner join  testDB.category_to_website t6 on t4.ID=t6.category_01_id
  WHERE t2.url = t3.url