2016-09-09 3 views
1

Я обновляю существующую таблицу, добавив данные в существующий столбец.Вставить/обновить столбец mysql на основе существующих данных

У меня уже есть вывод данных, которые нужно вставить, но из-за количества записей я ищу лучший способ вставить это в мой стол без необходимости вручную писать в каждую строку sql.

Вот мой SQL (частичные) я хочу, чтобы вставить в

INSERT INTO `tbl_user_variables_dobRE` (`user_id`, `value`) VALUES 
(150, '1959-11-02'), 
(151, '1948-04-20'), 
(152, '1961-06-18'), 

И это таблица я хочу, чтобы вставить его в

id   | 7 
username | guestinvite 
password | BLANK 
forname | forname 
surname | surname 
email  | [email protected] 
address_id | 286 
type_id | 4 
dob  | 0000-00-00 
plusGuest | 0 
update  | 2016-02-16 11:54:36 
created | 2016-04-04 17:03:12 

Так я хочу, чтобы вставить второй элемент в столбец «dob», где первый элемент = id

Есть ли все-таки сделать это программно или мне нужно писать WHERE & ИЛИ операторы для каждой строки?

+0

невозможно. 'insert' создает НОВЫЕ записи.если вы хотите настроить таргетинг на уже существующую запись, вам нужно «обновить». Вы ** МОЖЕТ ** иметь возможность использовать «вставку ... на предмет дублирования ключевого обновления», но поскольку вы не указали никаких подробностей о определении таблицы, это не совсем верно. –

+0

Спасибо @MarcB - я думал, что это будет обновление, но надеюсь, что будет какая-то команда обновления блока, о которой я не слышал раньше – gsusonline

+0

nope. многозначный синтаксис - это расширение mysql, специфичное для 'insert'. для запросов обновления нет эквивалента. –

ответ

2

Вы отметили как MySql, так и sql-сервер в своем сообщении. Следующее предполагает, что вы используете SQL Server, но идея останется неизменной в MySQL (просто другой синтаксис) ...

Если я правильно понимаю, похоже, что вы хотите сделать UPDATE, а не INSERT, поскольку вы изменяете существующие строки.

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

BEGIN TRANSACTION [Transaction1] -- Do large updates as transactions to avoid data loss 

CREATE TABLE #temp (-- Create temp table 
    [user_id] int, 
    [dob] nvarchar(20) 
) 

INSERT INTO #temp 
    -- YOUR SELECT GOES HERE 
    SELECT my_id as [user_id], my_dob as [dob] 


UPDATE my_table 
SET my_table.dob = t.dob 
FROM tbl_user_variables_dobRE my_table 
INNER JOIN #temp t ON t.user_id = my_table.id 

DROP TABLE #temp 

Если данные хорошо выглядит, совершать сделки: (! Не останавливаться слишком долго, операции блокировки данных таблицы)

COMMIT TRANSACTION [Transaction1] 

Иначе:

ROLLBACK TRANSACTION [Transaction1] 
+0

Спасибо за ответ (я имел в виду MySQL fyi - моя ошибка тега пропусков). Оба ответа решили проблему и сделали обновление за 5 минут, а не 2 часа – gsusonline

+0

Рад это слышать! – Santi

+0

Удивительный материал! Ответ Тайлера гораздо более глубокий, чем мой. Рад, что вы его отсортировали. – doublesidedstickytape

2

Самый быстрый способ, которым я могу это сделать, - создать временную таблицу с новыми данными, которые вы хотите добавить (вы можете, возможно, импортировать все это из файла CSV).

Для временного стола потребуется всего несколько колонок - один с user_id, а другой dob - после этого вы сможете избавиться от него.

Вы могли бы сделать что-то вроде этого:

UPDATE tbl_user_variables_dobRE a 
    JOIN tmp_table b 
    ON (a.user_id = b.user_id) 
    SET a.dob = b.dob 

После того, как вы сделали, что вы можете DROP вашу временную таблицу и хорошо идти - удачи!

Важно

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

+0

Perfect - спасибо – gsusonline

Смежные вопросы