[MySql] Как скопировать строку из одной таблицы в другую и заполнить дополнительные столбцы?

0

Поэтому я хочу сжать этот запрос, и я не уверен, как это сделать.

Щас пользуюсь

$move_to_sold = 
    "INSERT INTO sold_inv_item(
        'sku',
        'designer',
        'type',
        'price',
        'metal_type',
        'stone_type',
        'stone_weight',
        'item_desc',
        'item_img'
    )
    SELECT
        'sku',
        'designer',
        'type',
        'price',
        'metal_type',
        'stone_type',
        'stone_weight',
        'item_desc',
        'item_img'
    FROM inv_item
    WHERE 'sku' = '$sku'";

$add_date_and_name = 
    "UPDATE sold_inv_item 
    SET 'purchase_date' = '$date', 'customer_name' = '$name' 
    WHERE 'sku' = '$sku'";

я пытаюсь скопировать строку из одной таблицы в другую, а затем добавить дополнительные данные в 2 дополнительных столбца из данных $ _POST.

Я пробовал что-то вроде

INSERT INTO sold_inv_item('sku','designer','type','price','metal_type',
'stone_type','stone_weight','item_desc','item_img','purchase_date','customer_name') 

VALUES ((select 'sku','designer','type','price','metal_type',
'stone_type','stone_weight','item_desc','item_img' FROM inv_item WHERE inv_item.sku = 'pepsi-2-tone'), '2019-02-14','betty Girl');

Это дает ошибку несоответствия столбцов, я подозреваю, потому что он пытается поместить все строки в 1 столбец вместо того, чтобы распространять их.

Наконец это работает, но я бы предпочел сделать что-то вроде промежуточного решения, если это возможно.

INSERT INTO sold_inv_item('sku','designer','type','price','metal_type',
'stone_type','stone_weight','item_desc','item_img','purchase_date','customer_name') 

VALUES ((select 'sku' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'designer' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'type' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'price' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'metal_type' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'stone_type' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'stone_weight' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'item_desc' from inv_item where inv_item.sku = 'pepsi-2-tone'),
        (select 'item_img' from inv_item where inv_item.sku = 'pepsi-2-tone'),'2019-02-14','betty Girl');

Итак, наконец, вопрос в том, как наиболее эффективно использовать код и производительность для копирования строки из одной таблицы в другую и заполнения дополнительных столбцов. Там есть несколько похожих, но ни один, который я не могу найти, покрывает более 1-2 копируемых столбцов.

Теги:
database
performance

2 ответа

0
Лучший ответ

Вы можете использовать синтаксис INSERT... SELECT, например:

INSERT INTO sold_inv_item (
    'sku',
    'designer',
    'type',
    'price',
    'metal_type',
    'stone_type',
    'stone_weight',
    'item_desc',
    'item_img', 
    'purchase_date', 
    'customer_name'
)
SELECT 
    'sku',
    'designer',
     'type',
     'price',
     'metal_type',
     'stone_type',
     'stone_weight',
     'item_desc',
     'item_img',
     :date,
     :name
FROM inv_item
WHERE 'sku' = :sku

PS: когда дело доходит до использования параметров POST ed в SQL-запросах, любой в SO настоятельно рекомендует использовать подготовленные операторы и параметризованные запросы, чтобы защитить ваш код от внедрения SQL-кода и сделать ваши запросы более эффективными, читаемыми и обслуживаемыми. Я изменил запрос, чтобы использовать именованные параметры.

  • 1
    Это работает, я не знал, что вы можете добавить переменные, которые не существуют в таблице, из которой вы извлекаете данные, непосредственно в выборку. Спасибо!
  • 0
    Я просто получаю логику. Я преобразую это в подготовленный запрос, когда он перейдет к коду.
Показать ещё 1 комментарий
1

Просто добавьте его в ваш выбор, например

INSERT INTO sold_inv_item('sku','designer','type','price','metal_type', 
'stone_type','stone_weight','item_desc','item_img','purchase_date','customer_name')
VALUES ((select 'sku','designer','type','price','metal_type',
'stone_type','stone_weight','item_desc','item_img', '2019-02-14', 'betty Girl' 
FROM inv_item WHERE inv_item.sku = 'pepsi-2-tone') );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню