Sqlite检查表、字段是否存在,不存在则新增

有些时候我们可能需要在代码中检测某个表或某个表中某个字段是否存在,不存在的情况下通过代码去添加它,该怎么去判断呢 下边一块看一下:

判断表是否存在:

Sqlite会自动维护一个系统表sqlite_master,该表存储了我们所创建的各个table, view, trigger等信息。

select name from sqlite_master where type='table' order by name;
--select count(*) from sqlite_master where type='table' and name='表名'

在这里插入图片描述

判断字段是否存在:

这里有两种方式
第一种:可以清晰的查出表中的字段,在代码中用list接收然后判断list中有没有某个字段

PRAGMA  table_info([tablename])

在这里插入图片描述
第二种:可以通过查询创建表时的sql语句中是否包含某个字段

select * from sqlite_master where type = 'table' and name = 'ACbio' and sql like '%Barcode%'

在这里插入图片描述

新增字段
其中的 column 可以省略,同时也可以不给 default 默认值。

alter table 表名 add column 'asdasd' varchar(20) default 'hahah'
--等同于alter table 表名 add 'asdasd' TEXT

代码操作

public (bool, string) CheckFieldPresenceOrNot(string TableName,string[] Field, DBConnHelper DB,string LocalDBPath) {
            using (IDbConnection db = DB.DBConnection("Sqlite", "", LocalDBPath, ""))
            {
                try
                {
                    string TableSql = $"select count(*) from sqlite_master where type='table' and name='{TableName}' ";
                    int ExistTable= db.ExecuteScalar<int>(TableSql);
                    if (ExistTable<1)
                    {//表不存在则新增表
                        List<string> NeedAddField = new List<string>();
                        for (int i = 0; i < Field.Length; i++)
                        {
                            NeedAddField.Add($"{Field[i]} TEXT");
                        }
                        string FieldStr = string.Join(",", NeedAddField);
                        string AddTableSql = $"create table {TableName}({FieldStr})";
                        db.Execute(AddTableSql);
                        string CreateAfter = $"select count(*) from sqlite_master where type='table' and name='{TableName}'";

                        bool TableAddResult = db.ExecuteScalar<int>(TableSql)>0;

                        if (!TableAddResult) return (false, $"添加本地库新表时失败,请联系管理员");
                        else return (true, "");
                    }

                    List<string> FailureField = new List<string>();
                    for (int i = 0; i < Field.Length; i++)
                    {
                        string Sql = $"PRAGMA  table_info({TableName})";
                        List<TableStructureModel> TableStructure= db.Query<TableStructureModel>(Sql).ToList();
                        bool Exist= TableStructure.Where(a=>a.name==Field[i]).ToList().Count()>0;
                        if (!Exist)
                        {//如果不存在则新增字段
                            string AddField = $"alter table {TableName} add column '{Field[i]}' TEXT";
                            db.Execute(AddField)>0; 
                            //这里新增完之后应该判断一下是否新增成功
                            //。。。。
                        }
                    } 
                    return (true,"");
                }
                catch (Exception ex)
                {
                    Log.Error($"检查新增本地数据表或库字段时失败:{ex.Message + ex.StackTrace + ex.InnerException}");
                    return (false,ex.Message);
                }
            }
        }
<think>好的,我现在需要回答用户关于SQLite支持的字段类型及其用法的问题。首先,我要回想一下自己对SQLite的了解。SQLite是一种轻量级的数据库,它的数据类型和其他数据库系统有些同,比如MySQL或PostgreSQL。记得SQLite使用的是动态类型系统,允许字段存储任何类型的数据,这点可能和用户之前接触的其他数据库同。 根据用户提供的引用内容,特别是引用[3]中提到“sqlite字段类型”,里面应该有一些有用的信息。我需要确认SQLite具体支持哪些字段类型。根据我的记忆,SQLite有五种主要的存储类别:NULL、INTEGER、REAL、TEXT和BLOB。过,在创建表的时候,可以使用更广泛的类型名称,比如VARCHAR(255),但SQLite会将这些类型映射到上述五种存储类别之一。例如,声明为VARCHAR(255)的字段会被当作TEXT处理。 接下来,我需要参考用户提供的引用内容。引用[2]指出,SQLite的ALTER TABLE功能有限,无法修改字段类型,这说明字段类型在创建表时就需要确定,之后很难更改。而引用[3]提到用户在处理字段类型时遇到的挑战,可能需要灵活的数据存储策略。 现在需要组织这些信息,按照用户的要求,用中文回答,结构清晰,分点说明。首先介绍SQLite的动态类型特性,然后列出支持的字段类型及其映射关系,接着给出示例,最后说明注意事项,比如类型亲和性的概念和实际应用中的建议。 在生成相关问题的时候,需要围绕SQLite的类型系统、与其他数据库的对比、实际应用中的问题等方面展开。比如,可以询问动态类型的优缺点,如何修改表结构,类型亲和性的作用等。 最后,确保回答中正确引用用户提供的参考内容,特别是引用[2]和引用[3]中提到的字段类型修改限制和实际应用案例。同时,检查LaTeX格式是否符合要求,虽然在这个问题中可能用到数学公式,但如果有数值示例的话需要用正确的格式。</think>SQLite采用动态类型系统,其字段类型分为**存储类型**和**类型亲和性**两大类。以下是具体支持的字段类型及用法说明: ### 一、核心存储类型 1. **NULL**:表示空值 2. **INTEGER**:存储整数,根据值大小使用1~8字节存储 - 示例:`age INTEGER` 存储`18` 3. **REAL**:存储浮点数,采用8字节IEEE浮点数 - 示例:`price REAL` 存储`9.99` 4. **TEXT**:存储字符串,支持UTF-8/UTF-16编码 - 示例:`name TEXT` 存储`"张三"` 5. **BLOB**:存储二进制数据,按输入原样存储 - 示例:`avatar BLOB` 存储图片数据 ### 二、类型亲和性 SQLite支持在DDL语句中使用更丰富的类型名称(如`VARCHAR(255)`),但最终会映射到上述五类存储类型: ``` CREATE TABLE users ( id INT PRIMARY KEY, -- 映射为INTEGER email VARCHAR(255), -- 映射为TEXT salary DECIMAL(10,2) -- 映射为REAL ); ``` 类型亲和性规则: - `INT`/`TINYINT` → INTEGER - `CHAR`/`TEXT` → TEXT - `FLOAT`/`DOUBLE` → REAL - `BINARY` → BLOB ### 三、注意事项 1. 字段实际存储值可以匹配声明类型,如TEXT字段可存数字(但建议遵循类型亲和性)[^3] 2. 修改字段类型需重建表(ALTER TABLE仅支持重命名表和新增列)[^2] 3. 比较操作时,INTEGER和REAL可能自动转换(如`WHERE age = 25.0`) ### 四、应用建议 对于需要严格类型约束的场景,建议: ```sql CREATE TABLE logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT CHECK(typeof(content) = 'text'), created_at TEXT CHECK(datetime(created_at) IS NOT NULL) ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香煎三文鱼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值