将文件中的列添加到MariaDB 10.1中的现有表中

时间:2016-09-01 11:02:02

标签: mariadb load-data-infile

我希望将文件中的新列添加到现有表格中,方式与cbind在R中的方式相同。

该文件有1列,23710行,所有数字:

me@my_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 个答案:

答案 0 :(得分:1)

LOAD仅加载整行。

即使它只能加载一列,它如何知道每个数字的哪一行?

您必须使用两列(geneSymbol和sample69)重建数据,将其加载到临时表中,然后执行多表JOIN将数据移动到主表中。

<强>附加物

如果您有69列样本,那么设计架构是错误的。在某些时候,你会达到极限。

计划A:很多行,而不是很多列:

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

计划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条款?