2013-06-15 3 views
0

У меня есть две таблицы: t1 и t2
- t2 имеет только один столбец с именем stuff (60.000 записей).
- t1 имеет 15 столбцов, включая stuff (пусто). t1 имеет около 650 000 записей.Mysql один столбец таблицы -> вставить в другой таблице

Как я могу импортировать данные из t2.stuff в t1.stuff, когда мне нечего совместить? (Я просто хочу заполнить пустые поля t1.stuff данными от t2.stuff и не заботятся о соответствующих идентификаторах или что-то еще.)

Самый лучший случай (я думаю), будет, если я запустил этот запрос около 11 раз, все поля t1.stuff будут заполнены, потому что не осталось пустого поля в t1.stuff.

Вот пример того, что таблицы выглядит следующим образом:

t1:
|__a___|_b_|_c_|stuff|...|
|___308|foo|bar|_____|baz|
|___312|foo|bar|_____|baz|
...
|655578|foo|bar|_____|baz|

t2:
|___stuff___|
|some_info_1|
|some_info_2|
...
|some_info_n|

Может быть, есть несколько шагов, необходимых ...

UPDATE

Вот это РЕШЕНИЕ I жировик t с в случае, если кто-то имеет схожую проблему - Все кредиты заходят к пользователю nurdglaw для указания меня в правильном направлении. Так вот мы идем:

  1. Добавить новый столбец в таблицу в вопросе заселенного с номерами автоинкремента (я установил alter table t1 auto_increment = 1 и временно отключен автоинкремент на моем первичном ключе, чтобы избежать ошибок с этим кодом) ALTER TABLE t1 ADD COLUMN new_column INTEGER UNIQUE AUTO_INCREMENT;

  2. Сделал то же самое для t2.Если вы уже не имеете вторую таблицу, вы можете сделать что-то вроде этого: CREATE TABLE t2 (id INTEGER PRIMARY KEY AUTO_INCREMENT,t2_data_column VARCHAR(255)); < - регулировать количество ваших потребностей

    и импортировать данные с:
    LOAD DATA LOCAL INFILE 'path_on_your_server/data_file.csv'
    INTO TABLE t2
    LINES TERMINATED BY '\r\n' < - настройка к вашему LineBreak нужно
    (t2_data_column)

  3. Теперь, когда у вас есть что-то, чтобы соответствовать против, вы можете INNER JOINt1 с t2, выполнив следующие действия: Добавить данные из t2 в t1
    UPDATE t1 AS s
    JOIN t2 AS t ON t.id=s.new_column
    SET s.stuff=t.t2_data_column; < - stuff была колонна в t1 Я хотел, чтобы импортировать данные.

  4. Убирать бардак
    DROP TABLE t2;
    ALTER TABLE t1 DROP COLUMN new_column;
    Включить автоинкрементного на ваш первичный ключ снова и установить его на число, которое необходимо для новых строк, если вы использовали один раньше.

Все, все готово!

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

ответ

1

заявления INSERT создают новые строки в таблице. Вам нужно UPDATE на уже существующих строк

Простой способ сделать это с помощью Экстерн языка сценариев

; приведен пример rebol

; assumming вы используете библиотеку mysql от softinnov

; и a_ это имя уникального ключа к строке в t1

дб: открытые MySQL: // пользователь: пароль @ MySQL

вставка дб {select * from t1}

t1rows: копия БД

вставки дб {выбрать * из t2}

t2rows: копия БД

foreach row t1rows [

Вставить db [{update t1 set t1.stuff =? где t1. a_ =?} T2rows/1/1 row/1]

любой хвост? Следующие t2rows [

t2rows: head t2rows 

] [

t2rows: next t2rows 

]

]

Извините, у меня все еще есть трудности с форматированием и переменными в вашем примере

+0

Пух, я действительно пытался понять ваш ответ, но я не могу полностью следовать (я знаю, что я noob, в основном используется phpmyadmin для манипуляции с базами данных до сих пор ...). Что вы понимаете под уникальным ключом к строке в t1? Если вы имеете в виду первичный ключ в каждой строке, его автоинкрементные числа, такие как те, которые я помещаю в столбец 'a'. (Подчерки представляют «ничего» (пробел) на графике). Эти значения не просто начинаются с '1',' 2' и т. Д., Потому что многие строки нужно время от времени удалять. 't2' не имеет ничего подобного. Данные 't2' содержат чистый текст, импортированный из файла csv. –

+0

yes, первичный ключ является уникальным ключом, поэтому вы можете использовать a в приведенном выше выражении вместо a__, чтобы получить удержание для каждой отдельной строки – sqlab

+0

, вы, вероятно, можете достичь своего желания с помощью чистого mysql, используя курсоры и заданные операции, но я думаю, это будет сложнее получить – sqlab

0

Попробуйте

 INSERT INTO t1 (stuff) 
    SELECT DISTINCT stuff FROM t2 

Я надеюсь, что это помогает

+0

Спасибо, но, к сожалению, это дает мне: '# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего MySQL-сервера, для правильного синтаксиса для использования рядом с «AS SELECT stuff FROM t2» в строке 2' –

+0

@TinaMartinesz Я отредактировал код .. попробуйте сейчас –

+0

hmm, теперь я получаю: '# 1062 - Дублировать запись '' для ключа 'vkey'' –

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