Sqllite3 Create table as字段类型如何设置

marslycan 2018-10-25 05:17:19
通过下面查询语句生成新表后,利用sqlite3_column_decltype查询对应字段名发现TIME类型变成NUM类型,而原表中该字段类型为DATATIME类型,对应的Intger类型也变成INT,这是为什么呢?
如何Create table as 这种方式指定列名和类型呢~刚接触数据库,真的迷糊~~望大神指点迷津


DROP TABLE IF EXISTS AutoMergeTable;

Create table IF NOT EXISTS AutoMergeTable
AS SELECT * FROM
(
SELECT
*
FROM
(
SELECT *FROM
(
SELECT SN, JobName FROM HSG1
UNION
SELECT SN, JobName FROM HSG2
UNION
SELECT SN, JobName FROM HSG3
) TempTable
LEFT JOIN HSG1 ON TempTable.SN = HSG1.SN
LEFT JOIN HSG2 ON TempTable.SN = HSG2.SN
LEFT JOIN HSG3 ON TempTable.SN = HSG3.SN
)
GROUP BY SN HAVING COUNT(SN)<2 ORDER BY TIME) ;
...全文
559 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
marslycan 2018-10-26
  • 打赏
  • 举报
回复
引用 9 楼 mingqing6364 的回复:
或者你可以考虑换数据库,sqlite主要面对的场景是嵌入式,主要用于保存程序相关配置,而不是作为整个系统的数据支撑。

非常感谢~换数据库是不太可能了,目前看来只能自己写函数,获取原字段的类型 然后写入新表了~
mingqing6364 2018-10-26
  • 打赏
  • 举报
回复
或者你可以考虑换数据库,sqlite主要面对的场景是嵌入式,主要用于保存程序相关配置,而不是作为整个系统的数据支撑。
marslycan 2018-10-26
  • 打赏
  • 举报
回复
引用 5 楼 mingqing6364 的回复:
[quote=引用 4 楼 marslycan 的回复:]
我看到https://blog.csdn.net/haiross/article/details/17002119?utm_source=blogxgwz0这个帖子指出,慎用create table as 语句


他说慎用是因为要考虑字段默认值的问题,你这个是数据类型,可以考虑使用下面的语句来获取ddl
sqlite>select * from sqlite_master where type='table'; 


参考资料:https://blog.csdn.net/why10260922/article/details/80332786[/quote]
所以我最好也Create的方式么,看了一下原表的语句

marslycan 2018-10-26
  • 打赏
  • 举报
回复
刚试了下insert into 的方式,但是要自己设置各列类型,而类型来自与原表,感觉这样做非常绕
marslycan 2018-10-26
  • 打赏
  • 举报
回复
引用 5 楼 mingqing6364 的回复:
[quote=引用 4 楼 marslycan 的回复:]
我看到https://blog.csdn.net/haiross/article/details/17002119?utm_source=blogxgwz0这个帖子指出,慎用create table as 语句


他说慎用是因为要考虑字段默认值的问题,你这个是数据类型,可以考虑使用下面的语句来获取ddl
sqlite>select * from sqlite_master where type='table'; 



参考资料:https://blog.csdn.net/why10260922/article/details/80332786[/quote]


谢谢大大不烦解惑,我测试了一下输出结果
可以看到小表中的INTEGER变成了INT,TIME变成了NUM,这个给我带来很大困惑~看了一些帖子将数据库弱类型,如果生成的数据变成这样,INT还好说,可是时间该怎么让我识别,还是NUM指的就是时间。。
mingqing6364 2018-10-26
  • 打赏
  • 举报
回复
引用 4 楼 marslycan 的回复:
我看到https://blog.csdn.net/haiross/article/details/17002119?utm_source=blogxgwz0这个帖子指出,慎用create table as 语句


他说慎用是因为要考虑字段默认值的问题,你这个是数据类型,可以考虑使用下面的语句来获取ddl
sqlite>select * from sqlite_master where type='table'; 


参考资料:https://blog.csdn.net/why10260922/article/details/80332786
marslycan 2018-10-26
  • 打赏
  • 举报
回复
我看到https://blog.csdn.net/haiross/article/details/17002119?utm_source=blogxgwz0这个帖子指出,慎用create table as 语句
marslycan 2018-10-26
  • 打赏
  • 举报
回复
引用 1 楼 mingqing6364 的回复:
sqlite不要在意字段类型,这种数据库是弱类型的数据库
具体类型要看你存入的值,字段类型名设置成什么都行,'xyz'都不会报错,你在Intger类型的字段存入'ABC'也是可以的
举例:
sqlite> CREATE TABLE "main"."test" (
"id" INTEGER NOT NULL,
"str1" integer,
"str2" TEXT,
"str3" XYZ,
PRIMARY KEY ("id")
);
Query OK (0.08 sec)

sqlite> insert into test(id, str1, str2, str3) values(1, 'a', 'b', 'c');
Query OK - 1 row affected (0.08 sec)

sqlite> select * from test;
+----+------+------+------+
| id | str1 | str2 | str3 |
+----+------+------+------+
| 1 | a | b | c |
+----+------+------+------+
1 row in set (0.01 sec)

是这样的,我将数据库筛选的数据填在了ListCtrl上了,需要用户击中某一列,就将其一列数据统计,统计的前提需要判断数据类型是否符合~而数据库的查询结果我是按照数据类型存放在对应的容器:
// 查询指定行列的数据
bool GetQueryResult_bool(int nRow, int nCol);
int GetQueryResult_int(int nRow, int nCol);
double GetQueryResult_double(int nRow, int nCol);
std::wstring GetQueryResult_string(int nRow, int nCol);

// 获取整列的数据
void GetQueryResultVec_bool(std::vector<bool>& vDst, int nCol);
void GetQueryResultVec_int(std::vector<int>& vDst, int nCol);
void GetQueryResultVec_double(std::vector<double>& vDst, int nCol);
void GetQueryResultVec_string(std::vector<std::wstring>& vDst, int nCol);

而对应列的类型及列序号的获取是通过一个Map容器关联
mingqing6364 2018-10-26
  • 打赏
  • 举报
回复
http://www.runoob.com/sqlite/sqlite-data-types.html
可以具体了解一下:SQLite 数据类型
mingqing6364 2018-10-26
  • 打赏
  • 举报
回复
sqlite不要在意字段类型,这种数据库是弱类型的数据库
具体类型要看你存入的值,字段类型名设置成什么都行,'xyz'都不会报错,你在Intger类型的字段存入'ABC'也是可以的
举例:
sqlite> CREATE TABLE "main"."test" (
"id" INTEGER NOT NULL,
"str1" integer,
"str2" TEXT,
"str3" XYZ,
PRIMARY KEY ("id")
);
Query OK (0.08 sec)

sqlite> insert into test(id, str1, str2, str3) values(1, 'a', 'b', 'c');
Query OK - 1 row affected (0.08 sec)

sqlite> select * from test;
+----+------+------+------+
| id | str1 | str2 | str3 |
+----+------+------+------+
| 1 | a | b | c |
+----+------+------+------+
1 row in set (0.01 sec)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧