使用 sqlite3 如何在 SQL-db(或其 CSV)中设置一列的宽度



对此感到绝望:

我尝试将 SQL 表中一个特定列的宽度限制为 7 个字符宽。更准确地说,我想修剪列中的每个元素,使其成为宽度最多为 7 个字符的文本元素(如果更长,则应将其截断(。

另一种可能性是在创建 SQL-db 之前更改相应 CSV 列中的字符数。

问题:数据库很大!

(因此,使用大多数常用工具(如Sublime,Atom或Excel(无法更改CSV(在创建SQL-DB之前(

有哪些替代方案?(也许是sqlite3或一些终端cmd??

我的 CSV 文件 (table1.txt( 看起来像:

some_text,some_id,stop_name
"Hello World1","1101069:0:1","MyName1"
"Hello World2","1333332","MyName2"
"Hello World3","1452339:0","MyName3"
"Hello World4","8334342:2:0","MyName4"

some_id列应限制为 7 个字符,从而导致...

some_text,some_id,stop_name
"Hello World1","1101069","MyName1"
"Hello World2","1333332","MyName2"
"Hello World3","1452339","MyName3"
"Hello World4","8334342","MyName4"

我的 sqlite3 创建文件 (creationFile.sql( 看起来像这样:

CREATE TABLE table1 (some_text TEXT PRIMARY KEY, some_id TEXT, stop_name TEXT) WITHOUT ROWID;
.separator ,
.import table1.txt table1

我使用以下 sqlite3 终端 cmd 来创建数据库:

sqlite3 myTable.db > creationFile.sql`

现在,列宽限制可能已经在 CSV 文件中引入。但我认为这是不可能的,因为由于 CSV 文件的大小很大(> 10 行 Mio(,没有标准编辑器可以再这样做了。sqlite3 有没有办法在数据库创建过程中处理这个问题?或者任何终端cmd在创建数据库之前,期间或之后这样做?

你可以试试这个。创建table1后,运行以下语句:

CREATE TABLE table2 AS
SELECT some_text, SUBSTR(some_id, 1, 7) as some_id, stop_name
FROM table1;

注意:不确定 SUBSTR(( 函数的语法。最好用谷歌搜索一下。

也许不是最有效的方法,但由于我不知道该工具,我唯一可以看到的工具:

  1. 创建数据库并导入具有全文长度的所有数据。由于您的列类型text因此应该适用于任何文本长度。

  2. 之后,更新表格以修剪文本。例如,如果要缩短的文本是列的文本stop_name_text

    UPDATE table1
    SET stop_name_text = substr(stop_name_text, 1, 7);
    

    但是要小心,当你想对some_text这样做时:你声明为PRIMARY KEY。缩短可能会导致不同列中出现两个相同的文本。例如,如果您有"Hello World"和"Hello Walter",则都会导致"Hello W"。但是,声明PRIMARY KEY列的值必须是唯一的,因此在这种情况下UPDATE将失败。

    或者也许这是一个错误,你想实际上宣布some_idPRIMARY KEY?顾名思义。

最新更新