MySQL Update没有更新任何内容,但Select返回结果

时间:2015-03-13 18:01:34

标签: mysql

这真让我和我的经理感到难以置信。有两张桌子:

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;

也没有任何更新。无论我们尝试什么,我们都无法更新这些类别字段。

3 个答案:

答案 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)

我认为你不能在加入中更新.....我会在一两个查询之后做更新,并以结果等为基础