面试题答案
一键面试确保主数据库和附加数据库数据一致性
- 事务处理:
- 在进行涉及主数据库和附加数据库数据操作时,使用事务将相关操作包裹起来。这样要么所有操作都成功提交,要么都回滚,从而保证数据一致性。
- 示例代码(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()
- 外键约束:
- 启用外键约束,确保在进行数据插入、更新或删除操作时,数据库会检查数据依赖关系。
- 在 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) )''')
安全清理涉及外键约束的数据
- 级联删除:
- 当创建表时,使用
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")
- 当创建表时,使用
- 手动按顺序删除:
- 先删除子表中依赖的数据,再删除父表中的数据。
- 示例代码(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")