这真让我和我的经理感到难以置信。有两张桌子:
TableA (
id VARCHAR(15) NOT NULL,
category VARCHAR(35) DEFAULT '',
foo VARCHAR(3) DEFAULT '',
INDEX (category),
INDEX (foo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
TableB (
id VARCHAR(15),
INDEX (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我运行我需要更新的选择:
SELECT A.foo, A.id, B.id
FROM TableA A
LEFT JOIN TableB B
ON A.id = B.id
WHERE A.category = ''
AND A.foo NOT IN ('bar', '')
AND B.id IS NULL;
返回~2,000个结果,返回我期望的结果并希望它返回。
但是
UPDATE TableA A
LEFT JOIN TableB B
ON A.id = B.id
SET A.category='known'
WHERE A.category=''
AND A.foo NOT IN ('bar', '')
AND B.id IS NULL;
什么都不更新,
UPDATE
TableA A,
TableB B
SET A.category='known'
WHERE A.category=''
AND A.foo NOT IN ('bar', '')
AND B.id IS NULL;
也没有任何更新。无论我们尝试什么,我们都无法更新这些类别字段。
答案 0 :(得分:0)
嗯,难怪你对此感到难以置信,我也是。我可能与NOT IN有关吗?尝试AND A.foo<> '杆' AND A.foo<> ''
在任何情况下都必须在连接列上添加索引,并且FK不会受到伤害。
惊讶于这是解决方案,NOT IN必须像表子查询中的select一样?你每天都学到新东西,或者如果你尝试的话可以学习:)
答案 1 :(得分:0)
您的查询非常完美。 虽然您在select语句中看到~2,000个结果,但如果没有要更新的内容,您会看到0行受影响。
让我们看看这些查询以了解这种情况。
-- create employee table
CREATE TABLE employee (id INT, emp_name VARCHAR(20), dept_id INT);
-- insert records to employee
INSERT INTO employee(id, emp_name, dept_id)
VALUES (1, 'ram', 1), (2, 'shyam', 1), (3, 'sita', 2)
-- create department
CREATE TABLE department(id INT, dept_name VARCHAR(20))
-- insert recrods to department
INSERT INTO department(id, dept_name)
VALUES (1, 'java'), (2, '.net')
-- update
-- 1st execution it will show 2 rows affected.
UPDATE employee AS e
JOIN department AS d ON e.dept_id = d.id
SET e.dept_id = 1
,d.dept_name = 'dot net'
WHERE d.id = 2;
-- update (same statement as above)
-- 2nd execution (as we've already update just now will show 0 rows affected.
UPDATE employee AS e
JOIN department AS d ON e.dept_id = d.id
SET e.dept_id = 1
,d.dept_name = 'dot net'
WHERE d.id = 2;
答案 2 :(得分:-1)
我认为你不能在加入中更新.....我会在一两个查询之后做更新,并以结果等为基础