Вставка строки базы данных со значениями из другой таблицы - PullRequest
0 голосов
/ 14 августа 2011

В основном у меня есть две таблицы: images и servers. Когда я хочу вставить строку в таблицу images, мне нужно указать s_id в качестве одного из полей. Проблема в том, что у меня есть только name, что является другим полем в таблице servers. Мне нужно найти, что s_id принадлежит name, а затем использовать это в моем INSERT INTO запросе к таблице images.

Может быть, это изображение поможет: http://i.imgur.com/rYXbW.png

Я знаю только поле name из таблицы servers, и мне нужно использовать его, чтобы получить поле s_id из таблицы servers. Когда у меня это есть, я могу использовать его в своем запросе INSERT INTO, так как это внешний ключ.

Я нашел это: http://www.1keydata.com/sql/sqlinsert.html

Но это только смутило меня еще больше.

Одним из решений будет запуск двух запросов. Один для получения s_id и один для запуска запроса на вставку. Но я бы хотел ограничить количество выполняемых запросов, если есть разумная альтернатива.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 августа 2011

Вы можете использовать форму INSERT ... SELECT, что-то вроде этого (с реальными именами столбцов и значениями, конечно):

INSERT INTO images (s_id, u_id, name, filename, uploaded)
SELECT s_id, ...
FROM servers
WHERE name = 'the name'

Я не знаю, откуда вы получаете u_id,name, filename или uploaded значения столбца для images, но вы можете включить их в качестве литеральных значений в SELECT:

INSERT INTO images (s_id, u_id, name, filename, uploaded)
SELECT s_id, 11, 'pancakes', 'pancakes.jpg', '2011-05-28 11:23:42'
FROM servers
WHERE name = 'the name'

Этот тип вещи вставит несколько значений, еслиservers.name не уникален.

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

Пожалуйста, смотрите мой комментарий выше относительно потенциальной проблемы целостности данных. Я предполагаю, что поле имени в таблице вашего сервера имеет уникальное ограничение.

Есть несколько способов приблизиться к этому INSERT, и я уверен, что некоторые из них лучше, чем другие. Я не утверждаю, что мой путь - лучший, но он должен работать. Я не знаю, как вы пишете этот запрос, поэтому я буду использовать @FieldValue для представления ввода переменной. Мой подход заключается в использовании подзапроса в операторе вставки для получения данных, которые вам необходимы.

INSERT INTO images (field1, field2... s_id) VALUES ('@field1val', '@field2val'... (SELECT s_id FROM servers WHERE name='@nameval'));
0 голосов
/ 14 августа 2011

Вы должны быть в состоянии сделать что-то подобное, но вам нужно будет заполнить элементы в <> значениями, которые вы хотите вставить.

INSERT INTO images (s_id, u_id, name, filename, uploaded)
   (SELECT s_id, <u_id>, <name>, <filename>, <uploaded>
   FROM imgstore.servers
   WHERE name = @server_name)

Это синтаксис для SQL Server, но я думаю, что он будет работать и с MySQL.

Вот статья о INSERT ... SELECT Синтаксис

...