【问题标题】:Update statement does not work while select returns the matching rows当 select 返回匹配的行时,更新语句不起作用
【发布时间】:2017-02-22 09:56:31
【问题描述】:

我有一个 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

【问题讨论】:

  • 1) 运行更新查询时是否收到任何错误消息? 2) 您是否在 users.course_id 字段上定义了 FK 关系?
  • 1) 没有错误消息。 2) 没有 FK 关系。
  • 更好地与样本数据共享表结构。
  • 我对 users.course_id = courses.school_id 持怀疑态度,如果我们能看到示例数据,也许这应该是 users.course_id = courses.course_id 更好
  • 共享示例数据。

标签: mysql


【解决方案1】:

嗯.. 更新语句“有效”,但您的逻辑无效。

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)

正如预期的那样。

【讨论】:

    【解决方案2】:

    确实如此,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
    

    【讨论】:

    • 根据问题:“当我使用相同的查询来选择匹配的行时,它会获取20行。”这意味着 course_id 字段确实已填充。
    • 没有users.school_id
    • 检查样本数据
    • 另外,我正在使用 MySQL
    • 嗨 Akshay,使用您的示例数据,SELECT 语句返回 6 行(在 T-SQL 中):INNER JOIN 为每个用户返回 2 条记录(因为学校 1 有 2 门课程)。 UPDATE 返回 3 行,同样在 T-SQL 中。可能是 MySQL 不喜欢更新中的不确定连接。请检查stackoverflow.com/questions/35023658/mysql-update-with-subquery 看看这是否与您的情况有关
    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2021-03-31
    相关资源
    最近更新 更多