2016-09-01 3 views
0

Я хочу, чтобы добавить новый столбец из файла в существующую таблицу, в пути cbind делает в R.Добавить столбцы из файла в существующую таблицу в MariaDB 10.1

Файл имеет 1 столбцов, 23710 строк, все номера:

[email protected]_server:/var/www/html/my_website$ head my_sample.txt 
61 
66 
0 
330 
76 
9 
10 
16 
6 
0 

Используя код:

ALTER TABLE my_table ADD COLUMN IF NOT EXISTS sample69 INT(10) DEFAULT NULL; 
LOAD DATA LOCAL INFILE '/var/www/html/my_website/my_sample.txt' INTO TABLE my_table LINES TERMINATED BY '\n' (sample69); 

Перед:

MariaDB [my_database]> select * from my_table limit 10; 
+------------+-----------+ 
| geneSymbol | sample000 | 
+------------+-----------+ 
| A1BG  |  61 | 
| A1BG-AS1 |  66 | 
| A1CF  |   0 | 
| A2M  |  330 | 
| A2M-AS1 |  76 | 
| A2ML1  |   9 | 
| A2MP1  |  10 | 
| A4GALT  |  16 | 
| A4GNT  |   6 | 
| AA06  |   0 | 
+------------+-----------+ 

MariaDB [my_database]> select count(*) from my_table; 
+----------+ 
| count(*) | 
+----------+ 
| 23710 | 
+----------+ 

После:

MariaDB [my_database]> select * from my_table limit 10; 
+------------+-----------+-----------+ 
| geneSymbol | sample000 | sample69 | 
+------------+-----------+-----------+ 
| A1BG  |  61 |  NULL | 
| A1BG-AS1 |  66 |  NULL | 
| A1CF  |   0 |  NULL | 
| A2M  |  330 |  NULL | 
| A2M-AS1 |  76 |  NULL | 
| A2ML1  |   9 |  NULL | 
| A2MP1  |  10 |  NULL | 
| A4GALT  |  16 |  NULL | 
| A4GNT  |   6 |  NULL | 
| AA06  |   0 |  NULL | 
+------------+-----------+-----------+ 

MariaDB [my_database]> select count(*) from my_table; 
+----------+ 
| count(*) | 
+----------+ 
| 47420 | 
+----------+ 

Это, по-видимому добавляет данные в конец колонны. Вместо этого я хочу, чтобы новый столбец был такой же длины 23710, заполненный новыми данными из файла.

Что я делаю неправильно?

ответ

1

LOAD загружает только целые ряды.

Даже если он может загружать только один столбец, как он узнает, к какой строке относится каждый номер?

Вы должны восстановить данные с помощью двух столбцов (geneSymbol и sample69), загрузите их в таблицу temp, а затем сделайте многоэтажную JOIN, чтобы переместить данные в основную таблицу.

Addenda

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

План A: Много строк, а не участки колонн:

CREATE TABLE x (
    geneSymbol VARCHAR(..) ..., 
    num SMALLINT UNSIGNED NOT NULL, 
    value SMALLINT UNSIGNED NOT NULL, 
    PRIMARY KEY(geneSymbol, num) 
) ENGINE=InnoDB 

Plan B (Для этого потребуется код для добавления каждого нового образца):

CREATE TABLE x (
    geneSymbol VARCHAR(..) ..., 
    text NOT NULL, -- JSON encoded list of samples for that gene 
    PRIMARY KEY(geneSymbol) 
) ENGINE=InnoDB 

План C (направленный на чтение один образец):

CREATE TABLE x (
    num SMALLINT UNSIGNED NOT NULL, 
    text NOT NULL, -- JSON encoded list of values for that sample 
    PRIMARY KEY(num) 
) ENGINE=InnoDB 

Какими будут ваши вопросы? Я подозреваю, что вы будете читать все данные, а не делать какие-либо предложения WHERE на основе символа или num ??

+0

Я вижу, это дает объяснения и понимание. Тем не менее, я боюсь, что это будет медленнее, но громоздко, поскольку таблица растет, так как я буду динамически добавлять один столбец каждый раз, как только обрабатываются новые образцы. –

+0

Я добавил несколько вариантов. –

+0

Отличные планы! У меня будет более 100 образцов, и вы правы, что я буду читать все данные, чтобы загрузить загрузочную таблицу, оставив фильтрацию пользователю. План A дает в конечном итоге миллионы строк, лишних из geneSymbol и образцов, Plan B и C хороши, чтобы уменьшить столбцы до Json, но Json будет хранить довольно большие данные в одной ячейке. На самом деле я могу адаптировать любой План, но который, по вашему мнению, лучше всего подходит для моего размера данных для * retrieve *, а не для добавления *, потому что последний будет в фоновом режиме, а время не является проблемой, но первая будет пользователем интерактивный и быстрый дисплей? –

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