【问题标题】:SQL INSERT from SELECT从 SELECT 中插入 SQL
【发布时间】:2010-08-05 10:45:33
【问题描述】:

假设在我的代码中我有用户名和一个值。现在我需要将其保存在数据库中,但我需要首先获取与该用户名对应的 ID,因为该表通过 pk/fk 链接到用户表。我该怎么做? 我知道您可以执行 INSERT (blah) SELECT 等操作,但这看起来像一个直接副本,我需要插入 fk 列的值作为 SELECT 的结果。

用户表: [用户 ID(pk),用户名]

头像表: [UserID(fk), AvatarURL]

我需要 INSERT INTO AvatarTable(UserID, AvatarURL) VALUES (*id of user where UserName = 'theirname'*, 'http://www.blah.com')

谢谢

【问题讨论】:

  • 我们可以提供一些示例数据和数据结构信息吗?

标签: mysql c#-4.0


【解决方案1】:

您可能正在寻找这个?:

insert into myDestTable (userid, name, value, othercolumns)
select us.userid, us.name,'myvaluefromcode', othercolumns
from users us 
where us.name = 'mynamefromcode'

【讨论】:

  • 是的,等了 10 分钟左右才让我过去。
【解决方案2】:

不需要直接复制。只需使 select 语句的结果与目标表的列匹配即可。

例如

insert into NEW_TAB(user_name, order_id) 
select u.user_name, o.order_id 
from ORDER o
inner join USER u
  on o.user_id = u.user_id

【讨论】:

    【解决方案3】:

    假设您的表格结构类似于:

    users:
        user_id           integer
        user_name         varchar(50)
        user_other_data   varchar(999)
        primary key       (user_id)
        unique            (user_name)
    other_table:
        user_value        varchar(999)
        user_id           integer foreign key (users.user_id)
    

    您想要的是能够在other_table 中插入一个条目,只需给出值和用户名。

    您必须以原子方式执行此操作,以确保 user_id/user_name 映射不会在您下面更改。换句话说,你不能这样做:

    get user_id from users based on user_name.
    insert value and user_id into other_table.
    

    因为 user_id 或 user_name 可能会在上述两个步骤之间发生变化(对于物理行,user_id 可能不会发生变化,但表肯定有可能发生变化:

    user_id  user_name
    -------  ---------
    1        bob
    2        george
    

    到:

    user_id  user_name
    -------  ---------
    1        george
    2        bob
    

    因此,要以原子方式执行,它必须在单个 SQL 语句中(或事务的一部分,但在这种情况下您可以避免事务):

    insert into other_table (user_value, user_id)
        select :value, user_id from users where user_name = :name;
    

    对于您的具体情况(在我的原始答案之后添加),您正在查看:

    insert into AvatarTable (UserID,AvatarURL)
        select UserID, :localAvatarURL
        from UserTable
        where UserName = :localUserName;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2021-04-29
      • 2011-06-20
      • 2020-03-05
      相关资源
      最近更新 更多