INSERT INTO SELECT - более 1 строки - PullRequest
       3

INSERT INTO SELECT - более 1 строки

0 голосов
/ 09 октября 2018

Я привык иметь insert into select, где все значения взяты из других таблиц.В этом случае я пытаюсь скопировать существующий канал.У меня есть одна сводная таблица, которая нуждается в копировании значений одного фида в новый.В таблице только два столбца, но я использую одно значение из SQL, и идентификатор нового канала не меняется.

 DB::statement('INSERT INTO feed_media_permissions 
            (feed_id, optin_media_id)
            VALUES 
            ('. $feed->id .', 
            (SELECT forig.optin_media_id AS optin_media_id
            FROM feed_media_permissions as forig 
            WHERE forig.feed_id = ' . $existing_feed_id . ')
            )');

Дает эту ошибку ...

SQLSTATE [21000]: Нарушение кардинальности: 1242 Подзапрос возвращает более 1 строки (SQL: INSERT INTO feed_media_permissions (feed_id, optin_media_id) VALUES (158, (SELECT forig.optin_media_id AS optin_media_id FROM feed_media_permissions как 15-й идентификатор))))

Можно копировать 0-4 строки каждый раз.Есть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Непосредственной причиной вашей ошибки является то, что подзапрос возвращает более одной строки.Возможное исправление может заключаться в том, чтобы просто использовать выбор с несколькими строками в качестве источника данных для вставки.То есть используйте конструкцию INSERT INTO ... SELECT:

INSERT INTO feed_media_permissions (feed_id, optin_media_id)
SELECT ?, forig.optin_media_id
FROM feed_media_permissions AS forig 
WHERE forig.feed_id = ?;

В идеале вы должны использовать здесь подготовленный оператор PHP.С первым заполнителем вы бы связали $feed->id, а со вторым вы бы связали $existing_feed_id.

0 голосов
/ 09 октября 2018

Ваш $feed->id должен быть в подзапросе, чтобы убедиться, что он находится в каждой возвращаемой строке.

DB::statement('INSERT INTO feed_media_permissions 
    (feed_id, optin_media_id)
    VALUES 
    (SELECT '. $feed->id .' as feed_id, forig.optin_media_id AS optin_media_id
    FROM feed_media_permissions as forig 
    WHERE forig.feed_id = ' . $existing_feed_id . ')
');

Вы также должны использовать привязки для предотвращения SQL-инъекций:

DB::statement('INSERT INTO feed_media_permissions 
    (feed_id, optin_media_id)
    VALUES 
    (SELECT ? as feed_id, forig.optin_media_id AS optin_media_id
    FROM feed_media_permissions as forig 
    WHERE forig.feed_id = ?)
', [$feed->id, $existing_feed_id]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...