MST
星途 面试题库

面试题:SQLite附加数据库时的数据一致性问题及清理策略

在SQLite附加数据库操作过程中,如果主数据库和附加数据库之间存在数据依赖关系,如何确保数据一致性?同时,当清理数据库时,若涉及到外键约束,怎样在不破坏数据完整性的前提下,安全地清理相关数据,详细阐述操作思路并给出示例代码。
32.2万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试

确保主数据库和附加数据库数据一致性

  1. 事务处理
    • 在进行涉及主数据库和附加数据库数据操作时,使用事务将相关操作包裹起来。这样要么所有操作都成功提交,要么都回滚,从而保证数据一致性。
    • 示例代码(Python 使用 sqlite3 库):
    import sqlite3
    
    # 连接主数据库
    conn_main = sqlite3.connect('main.db')
    # 附加数据库
    conn_main.execute("ATTACH DATABASE 'additional.db' AS additional")
    
    try:
        cursor = conn_main.cursor()
        # 开始事务
        conn_main.execute('BEGIN')
        # 主数据库操作
        cursor.execute("INSERT INTO main_table (col1, col2) VALUES ('value1','value2')")
        # 附加数据库操作,假设附加数据库有个相关表 additional_table
        cursor.execute("INSERT INTO additional.additional_table (col1, col2) VALUES ('value1','value2')")
        # 提交事务
        conn_main.execute('COMMIT')
    except Exception as e:
        # 发生错误回滚事务
        conn_main.execute('ROLLBACK')
        print(f"事务执行失败: {e}")
    finally:
        # 关闭连接
        conn_main.close()
    
  2. 外键约束
    • 启用外键约束,确保在进行数据插入、更新或删除操作时,数据库会检查数据依赖关系。
    • 在 SQLite 中,默认外键约束是关闭的,需要手动开启。
    • 示例代码(Python 使用 sqlite3 库):
    import sqlite3
    
    # 连接主数据库
    conn_main = sqlite3.connect('main.db')
    # 附加数据库
    conn_main.execute("ATTACH DATABASE 'additional.db' AS additional")
    # 开启外键约束
    conn_main.execute('PRAGMA foreign_keys = ON')
    
    cursor = conn_main.cursor()
    # 创建主表并设置外键约束(假设附加数据库中有个关联表 additional_table 有主键 id)
    cursor.execute('''CREATE TABLE main_table (
        id INTEGER PRIMARY KEY,
        additional_id INTEGER,
        FOREIGN KEY (additional_id) REFERENCES additional.additional_table(id)
    )''')
    

安全清理涉及外键约束的数据

  1. 级联删除
    • 当创建表时,使用 ON DELETE CASCADE 子句,这样当父表中的记录被删除时,与之关联的子表记录也会自动被删除。
    • 示例代码(Python 使用 sqlite3 库):
    import sqlite3
    
    # 连接主数据库
    conn_main = sqlite3.connect('main.db')
    # 附加数据库
    conn_main.execute("ATTACH DATABASE 'additional.db' AS additional")
    # 开启外键约束
    conn_main.execute('PRAGMA foreign_keys = ON')
    
    cursor = conn_main.cursor()
    # 创建父表
    cursor.execute('''CREATE TABLE parent_table (
        id INTEGER PRIMARY KEY
    )''')
    # 创建子表并设置级联删除
    cursor.execute('''CREATE TABLE child_table (
        id INTEGER PRIMARY KEY,
        parent_id INTEGER,
        FOREIGN KEY (parent_id) REFERENCES parent_table(id) ON DELETE CASCADE
    )''')
    
    # 插入数据
    cursor.execute("INSERT INTO parent_table (id) VALUES (1)")
    cursor.execute("INSERT INTO child_table (id, parent_id) VALUES (1, 1)")
    
    # 删除父表记录,子表记录会自动删除
    cursor.execute("DELETE FROM parent_table WHERE id = 1")
    
  2. 手动按顺序删除
    • 先删除子表中依赖的数据,再删除父表中的数据。
    • 示例代码(Python 使用 sqlite3 库):
    import sqlite3
    
    # 连接主数据库
    conn_main = sqlite3.connect('main.db')
    # 附加数据库
    conn_main.execute("ATTACH DATABASE 'additional.db' AS additional")
    # 开启外键约束
    conn_main.execute('PRAGMA foreign_keys = ON')
    
    cursor = conn_main.cursor()
    # 假设存在主表 main_table 和附加数据库中的子表 additional_table 有外键关系
    # 先删除子表数据
    cursor.execute("DELETE FROM additional.additional_table WHERE main_id = (SELECT id FROM main_table WHERE some_condition)")
    # 再删除主表数据
    cursor.execute("DELETE FROM main_table WHERE some_condition")