You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从SQLite数据库获取FK-PK关联关系?(C#/System.Data.Sqlite场景)

提取SQLite外键-主键关联关系的解决办法

嘿Dave,我之前用System.Data.SQLite做元数据提取的时候也碰到过这个问题——常规的GetSchema方法没法直接拿到完整的外键关联信息,得借助SQLite原生的PRAGMA命令来搞定,给你分享两种实用的方式:

方法一:用PRAGMA命令直接查询外键详情

SQLite提供了PRAGMA foreign_key_list(表名)命令,专门用来查询指定表的所有外键关联。这个命令返回的结果里包含了外键所在列、关联的主表、主表的主键列等关键信息。

下面是完整的C#代码示例,能遍历所有表并提取它们的外键关联:

using System.Data;
using System.Data.SQLite;

class SqliteMetadataExtractor
{
    static void Main(string[] args)
    {
        string dbPath = "your_database_file.db";
        using (var connection = new SQLiteConnection($"Data Source={dbPath};Version=3;"))
        {
            connection.Open();
            
            // 先获取数据库中所有的表(排除视图)
            var tablesSchema = connection.GetSchema("Tables");
            foreach (DataRow tableRow in tablesSchema.Rows)
            {
                string tableName = tableRow["TABLE_NAME"].ToString();
                string tableType = tableRow["TABLE_TYPE"].ToString();
                
                // 只处理普通表,视图没有外键
                if (tableType != "TABLE") continue;
                
                // 查询当前表的外键信息
                using (var fkCmd = new SQLiteCommand($"PRAGMA foreign_key_list({tableName})", connection))
                {
                    using (var fkReader = fkCmd.ExecuteReader())
                    {
                        while (fkReader.Read())
                        {
                            string fkColumn = fkReader["from"].ToString();
                            string referencedTable = fkReader["table"].ToString();
                            string referencedPkColumn = fkReader["to"].ToString();
                            int fkId = Convert.ToInt32(fkReader["id"]);
                            
                            Console.WriteLine($"表 [{tableName}] 的外键列 [{fkColumn}] 关联到 [{referencedTable}] 的主键列 [{referencedPkColumn}](外键ID:{fkId})");
                        }
                    }
                }
                
                // 如果需要同时获取当前表的主键信息,可以用PRAGMA table_info
                using (var pkCmd = new SQLiteCommand($"PRAGMA table_info({tableName})", connection))
                {
                    using (var pkReader = pkCmd.ExecuteReader())
                    {
                        while (pkReader.Read())
                        {
                            if (Convert.ToInt32(pkReader["pk"]) == 1)
                            {
                                string pkColumn = pkReader["name"].ToString();
                                Console.WriteLine($"表 [{tableName}] 的主键列是 [{pkColumn}]");
                            }
                        }
                    }
                }
            }
        }
    }
}

方法二:利用System.Data.SQLite的GetSchema扩展(版本依赖)

如果你用的是较新版本的System.Data.SQLite(比如1.0.115及以上),可以尝试用GetSchema("ForeignKeys")来直接获取外键集合,不过这个方法返回的字段可能需要你自己映射,而且兼容性不如PRAGMA命令稳定。示例代码如下:

var foreignKeys = connection.GetSchema("ForeignKeys");
foreach (DataRow fkRow in foreignKeys.Rows)
{
    string fkTable = fkRow["TABLE_NAME"].ToString();
    string fkColumn = fkRow["COLUMN_NAME"].ToString();
    string pkTable = fkRow["REFERENCED_TABLE_NAME"].ToString();
    string pkColumn = fkRow["REFERENCED_COLUMN_NAME"].ToString();
    
    Console.WriteLine($"外键:[{fkTable}].[{fkColumn}] -> [{pkTable}].[{pkColumn}]");
}

注意事项

  • SQLite默认是禁用外键约束的,但这不影响外键元数据的存储,所以即使没开启约束,PRAGMA命令依然能查到定义好的关联关系。
  • 视图没有外键定义,所以遍历的时候记得过滤掉视图类型。

希望这些方法能帮你解决问题,如果还有细节不清楚随时问!

内容的提问来源于stack exchange,提问作者David Thielen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:52:29