当select返回匹配的行时,Update语句不起作用

时间:2016-10-13 10:16:23

标签: mysql

我有users表映射到schools表。 但是,最近我引入了一个courses表,现在映射到schools表。 我试图打破用户和学校之间的关系,并通过课程将它们联系起来。

我正在尝试使用连接更新users表中受影响的行,但是没有更新任何行。我也没有看到任何错误消息。

当我使用相同的查询来选择匹配的行时,它会获取20行。

更新查询失败的可能原因是什么?我检查并验证了有些行需要更新。

更新查询:

UPDATE users INNER JOIN courses ON users.course_id = courses.school_id SET users.course_id = courses.id

选择查询:

SELECT * FROM users INNER JOIN courses on users.course_id = courses.school_id

可能是因为我试图更新JOIN子句中使用的相同字段吗?

修改

表结构:

学院:

id | name
--------------
1  | St. Joseph\'s
2  | St. Mary\'s

课程:

id | school_id
--------------
1  | 1
2  | 1
3  | 2

用户:

id | name | course_id
---------------------
1  | Ray  | 1
2  | Jake | 1
3  | Sam  | 1

注意: users.course_id实际上现在已映射到schools.id。 需要将其映射到courses.id

2 个答案:

答案 0 :(得分:0)

确实,SQL首先检索与您的连接匹配的行。由于users.course_id没有值,因此不会检索任何行。

你可能想要这样的东西:

UPDATE  Users
SET     users.course_id = courses.id
FROM    users 
INNER JOIN courses 
    on users.school_id= courses.school_id

在这个查询中,我假设用户有一个school_id(从最初的两个表情况)。请注意,您的SELECT语句具有以下连接:

users.course_id = courses.school_id

可能应该是(??)

users.school_id = courses.school_id

答案 1 :(得分:0)

嗯..更新声明“有效”但你的逻辑没有。

drop table if exists courses;
create table courses (id int, school_id int);
insert into courses values
(10 , 1),
(2  , 1),
(3  , 2);
drop table if exists Users;
create table users (id int, name varchar(4), course_id int);
insert into users values
(1   ,'Ray' , 1),
(2   ,'Jake', 1),
(3   ,'Sam' , 1);

UPDATE users INNER JOIN courses ON users.course_id = courses.school_id SET users.course_id = courses.id  ;

select * from users;

结果

+------+------+-----------+
| id   | name | course_id |
+------+------+-----------+
|    1 | Ray  |        10 |
|    2 | Jake |        10 |
|    3 | Sam  |        10 |
+------+------+-----------+
3 rows in set (0.00 sec)

这是预期的。