Выбор второго внешнего ключа при вставке строки - PullRequest
0 голосов
/ 21 августа 2011
INSERT INTO `images` (s_id, u_id, name, filename, filesize, uploaded)
SELECT s_id, ?, ?, ?, ?, ?
FROM servers
WHERE name = ?

В настоящее время я использую этот оператор SQL, когда пользователь загружает изображение на мой сайт.Поле s_id является внешним ключом для таблицы servers, а поле u_id является внешним ключом для таблицы users.Я хочу выбрать идентификатор пользователя (u_id) из таблицы пользователей по имени пользователя (всегда уникальному) и использовать его в этом операторе вставки.

Я уже выполнил часть, которая выбирает идентификатор сервера (s_id) но это было в значительной степени случайностью и бездельничанием.Я не совсем уверен, как адаптировать этот запрос к двум операторам выбора?

Помощь приветствуется, спасибо!

Ответы [ 4 ]

0 голосов
/ 21 августа 2011

Интересно, почему никто не упомянул

INSERT INTO `images` (s_id, u_id, name, filename, filesize, uploaded)
SELECT s_id, u_id, ?, ?, ?, ?
FROM servers JOIN users 
WHERE name = ? AND username = ?

Это безусловное соединение, но, тем не менее, оно должно давать только одну строку с указанным сервером и пользователем.

0 голосов
/ 21 августа 2011

Попробуйте:

DECLARE userID int
SELECT u_id FROM users into userID
WHERE useranem = ?

Затем используйте переменную useriD в INSERT позже.Я пользователь SQL Server, а не MySQL, но из того, что я прочитал, я понял, что синтаксис правильный.

0 голосов
/ 21 августа 2011

Я предпочитаю что-то вроде этого, чтобы вы получили два уникальных сканирования индекса, и на этом все; при условии, что таблицы однозначно индексируются как по уникальному ключу, так и по значению, которое вы хотите вернуть.

insert into 'images' (s_id, u_id, name, filename, filesize, uploaded)
select ( select s_id
           from servers
          where name = ? )
     , ( select u_id
            from users
           where username = ? )
     , 'name'
     , 'filename'
     , 'filesize'
     , 'uploaded'
  from dual;
0 голосов
/ 21 августа 2011
INSERT INTO `images` (s_id, u_id, name, filename, filesize, uploaded)
SELECT (select s_id from servers where name=?') as s_id, 
(select user_id from users where username=?) as user_id, 
?, ?, ?, ?;
...