将列添加到sqlite数据库并基于主键分配行

时间:2019-03-10 23:19:22

标签: sql database sqlite

我有一些数据元素,其中包含一个时间戳以及与此时间戳相关的有关X项销售的信息。 例如

timestamp |  items X sold
------------------------
1         |     10
4         |     40
7         |     20

我将此数据存储在SQLite表中。现在我要添加到此表中。特别是如果我获得有关另一个项目Y的数据。 项目Y数据可能具有也可能没有时间戳,但是我想将此数据插入现有表中,使其看起来像这样:

timestamp |  items X sold  | items Y sold
------------------------------------------
1         |     10         |      5
2         |     NULL       |      10    
4         |     40         |      NULL
5         |     NULL       |      3
7         |     20         |      NULL

以后,必须使用相同的方案添加其他销售数据(列)。 有没有简单的方法可以使用SQLite完成此操作? 最后,我想按时间戳获取数据,并概述此时已售出的商品。大多数示例都考虑用例添加一个完整的行(一个记录)或一个完整的列(如果它与其他列完全匹配)。

还是sqlite是错误的工具?而且我宁愿使用csv还是excel?

(使用pythons sqlite3包创建和操作数据库)

谢谢!

1 个答案:

答案 0 :(得分:0)

动态添加列不是一个好的设计。您可以使用

添加它们
ALTER TABLE your_table ADD COLUMN the_column_name TEXT  
  • 对于现有行,该列将填充为空值,尽管您可以指定DEFAULT值,然后使用该值填充现有行。

例如以下演示了上述内容:-

DROP TABLE IF EXISTS soldv1;
CREATE TABLE IF NOT EXISTS soldv1 (timestamp INTEGER PRIAMRY KEY, items_sold_x INTEGER);
INSERT INTO soldv1 VALUES(1,10),(4,40),(7,20);
SELECT * FROM soldv1 ORDER BY timestamp;
ALTER TABLE soldv1 ADD COLUMN items_sold_y INTEGER;
UPDATE soldv1 SET items_sold_y = 5 WHERE timestamp = 1;
INSERT INTO soldv1 VALUES(2,null,10),(5,null,3);
SELECT * FROM soldv1 ORDER BY timestamp;

导致第一个查询返回:-

enter image description here

,第二个查询返回:-

enter image description here

但是,如上所述,由于架构是动态的,因此上述内容不被认为是好的设计。

您可以通过添加新列(也将成为主键的一部分)或通过为时间戳添加前缀/后缀来交替管理上述内容。

例如,考虑以下内容:-

DROP TABLE IF EXISTS soldv2;
CREATE TABLE IF NOT EXISTS soldv2 (type TEXT, timestamp INTEGER, items_sold INTEGER, PRIMARY KEY(timestamp,type));
INSERT INTO soldv2 VALUES('x',1,10),('x',4,40),('x',7,20);
INSERT INTO soldv2 VALUES('y',1,5),('y',2,10),('y',5,3);
INSERT INTO soldv2 VALUES('z',1,15),('z',2,5),('z',9,25);
SELECT * FROM soldv2 ORDER BY timestamp;

这已经在数据方面复制了原始数据,并另外添加了另一种类型(column items_sold_z),而无需更改表的架构(也没有其他麻烦,需要更新而不是在应用时按插入时间戳1 items_sold_y 5)

查询结果为:-

enter image description here

  

还是sqlite是错误的工具?而且我宁愿使用csv还是excel?

SQLite是有效的工具。然后,您可以对数据进行处理,就像在excel中一样容易(也许更简单),并且比尝试以csv格式处理数据要简单得多。

例如,假设您想要每个时间戳售出的商品总数以及售出了多少种商品:-

SELECT timestamp, count(items_sold) AS number_of_item_types_sold, sum(items_sold) AS total_sold FROM soldv2 GROUP by timestamp ORDER BY timestamp;

将导致:-

enter image description here