我一直在将数据从主数据库复制到测试数据库,因此当我需要在主数据库中的表之间移动列时,我可以熟悉它的工作原理。目前,我可以使用此查询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
。我怎么能做到这一点?
答案 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