SQL INSERT из SELECT - PullRequest
       10

SQL INSERT из SELECT

0 голосов
/ 05 августа 2010

Допустим, в моем коде есть имя пользователя и значение.Теперь мне нужно сохранить это в БД, но мне нужно сначала получить идентификатор, соответствующий имени этого пользователя, потому что эта таблица связана с таблицей pk / fk с таблицей пользователей.Как мне это сделать?Я знаю, что вы можете сделать INSERT (бла) SELECT и т. Д., Чтобы сделать это, но это выглядит как прямая копия, мне нужно вставить значение в столбце fk как результат SELECT.

ПользовательТаблица: [UserID (pk), UserName]

Таблица аватаров: [UserID (fk), AvatarURL]

Мне нужно INSERT INTO AvatarTable(UserID, AvatarURL) VALUES (*id of user where UserName = 'theirname'*, 'http://www.blah.com')

Спасибо

Ответы [ 3 ]

5 голосов
/ 05 августа 2010

Возможно, вы ищете это:

insert into myDestTable (userid, name, value, othercolumns)
select us.userid, us.name,'myvaluefromcode', othercolumns
from users us 
where us.name = 'mynamefromcode'
0 голосов
/ 05 августа 2010

Предполагая, что ваши таблицы структурированы примерно так:

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;
0 голосов
/ 05 августа 2010

не обязательно быть прямой копией.Просто сделайте так, чтобы результат оператора 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...