【问题标题】:sql update with joined tables使用连接表进行 sql 更新
【发布时间】:2012-02-14 21:29:39
【问题描述】:

假设我有这个选择语句:

SELECT ut.user_id,
       a.firstname,
       a.surname,
       u.username,
       u.email_address
  FROM administrators a 
  JOIN user_types ut JOIN users u ON a.admin_id = ut.type_id 
   AND u.user_id = ut.user_id AND ut.user_type = 'ADMIN';

假设我想更新 user_id = 1 行中的所有值;

我可以单独更新每个表,或者我可以创建一个像这样的视图:

CREATE OR REPLACE VIEW full_admin AS
SELECT ut.user_id,
       a.firstname,
       a.surname,
       u.username,
       u.email_address
  FROM administrators a 
  JOIN user_types ut 
  JOIN users u  on a.admin_id = ut.type_id 
   AND u.user_id = ut.user_id 
   AND ut.user_type = 'ADMIN'

然后我可以写:

UPDATE full_admin
   SET firstname = 'blah', etc, etc
 WHERE user_id = 1;

这将更新所有表中的所有行

有没有办法在不创建视图的情况下做到这一点?

类似:

UPDATE (
    SELECT ut.user_id,
           a.firstname,
           a.surname,
           u.username,
           u.email_address
      FROM administrators a 
      JOIN user_types ut 
      JOIN users u ON a.admin_id = ut.type_id 
       AND u.user_id = ut.user_id 
       AND ut.user_type = 'ADMIN'
)
AS temp_table
  SET firstname = "ALEX"
WHERE user_id = 1;

但是这不起作用

【问题讨论】:

标签: mysql sql-update


【解决方案1】:

如果您想同时update columns in both 管理员和用户,那么这样的事情应该可以解决问题:

UPDATE administrators a  
        INNER JOIN user_types ut ON a.admin_id = ut.type_id 
        INNER JOIN users u ON u.user_id = ut.user_id 
            SET u.firstname = "ALEX", a.SomeColumn = 'X' 
        WHERE u.user_id = 1 
                 AND ut.user_type = 'ADMIN' 

SET 语句部分可以作用于连接中的任何列。

(如果你问的是这个!)

【讨论】:

    【解决方案2】:
    UPDATE administrators a 
    INNER JOIN user_types ut ON a.admin_id = ut.type_id
    INNER JOIN users u ON u.user_id = ut.user_id AND ut.user_type = 'ADMIN'
    SET u.firstname = "ALEX"
    WHERE u.user_id = 1
    ;
    

    当然,这只有在连接表结构是可更新的情况下才有效(同样的事情适用于视图)。

    【讨论】:

    • 并非所有 JOINS 都是可更新的,例如LEFT JOINS 将不起作用(数据库没有 PK 来寻址一行)。这与 Views 完全相同。
    【解决方案3】:

    您可以编写一些脚本 (PLSQL),但我不相信您可以在一个 SQL 查询中更新多个表,而不是通过视图。

    PLSQL 功能强大且不复杂,可以由数据库事件触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2014-01-14
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      相关资源
      最近更新 更多