导入制表符分隔的文本以更新远程计算机上的MySQL表


Import tab delimited text to update MySQL table on remote machine

问题出在UPDATE行。我得到的错误说明错误:不是唯一的表/别名:"tmpStock"我以前从未使用过INNER JOIN。

$link = mysql_connect('host', 'log', 'pwd');
If (!$link) { die ('Could not connect: ' . mysql_error()); }
@mysql_select_db('admin_sandbox') or die ('Unable to select database');
$result = mysql_query("CREATE TEMPORARY TABLE tmpStock
(pid int(10), cid int(10), manufacturer_id int(10), is_visible enum('Yes', 
'No'), product_type varchar(50), is_dollar_days enum('Yes', 
'No'), product_id varchar(64), is_doba enum('Yes', 'No'),is_locked 
enum('Yes', 'No'), 
inventory_control enum('Yes', 'AttrRuleExc') ) ENGINE=MyISAM DEFAULT 
CHARSET=latin1 ");
$result = mysql_query("LOAD DATA LOCAL INFILE 'sampleproducts.txt' INTO 
TABLE tmpStock FIELDS TERMINATED BY ''t' ENCLOSED BY ''"' LINES TERMINATED 
BY ''n'")or die ('Error: '.mysql_error ());
$result = mysql_query("UPDATE tmpStock INNER JOIN products ON 
tmpStock.product_id = products.product_id SET 
products.stock = tmpStock.stock WHERE tmpStock.product_id = 
products.product_id") or die ('Error: '.mysql_error ());

您在UPDATE查询中列出了两个表,然后在tmpStock上列出了内部联接,因此在查询中复制了tmpStock。您可以使用自联接,但它们需要一个别名。但在这里,它是完全多余的。

在MySQL中,像在SELECT语句中一样使用INNER JOIN,只有FROM子句在开始时被UPDATE替换,SET放在表联接之后,WHERE子句在最后:

"UPDATE tmpStock 
INNER JOIN products ON tmpStock.product_id = products.product_id 
SET products.stock = tmpStock.stock;"

此外,我逆转了SET的表达。由于临时表是在用户会话后销毁的,所以您不会在任何一个表中看到更改。您很可能希望更新products表中的stock字段。