如何在Python的sqlite3中创建SQL主键与外键?
表创建代码问题分析与修正
存在的问题
- 语法错误:两张表的CREATE语句最后一列末尾都多了一个逗号,这会导致SQL执行失败。
- 外键逻辑错误:
- car_main表中
model_id外键引用car_main(car_id)逻辑不合理,外键应指向其他表的主键(通常是车型表的model_id),而非自身主键。 - car_info表中
model_id引用car_main(model_id)不合法,外键必须关联目标表的主键或唯一约束列,而car_main.model_id不满足该条件。
- car_main表中
- 外键约束未启用:SQLite默认禁用外键约束,若不手动开启,设置的外键规则不会生效。
修正后的代码示例
import sqlite3 connection = sqlite3.connect("TutorialDB.db") # 开启SQLite外键约束 connection.execute("PRAGMA foreign_keys = ON") crsr = connection.cursor() # 先创建关联的model表(若你的业务中车型信息单独存储) sql_command = """CREATE TABLE IF NOT EXISTS model ( model_id INTEGER PRIMARY KEY, model_name TEXT NOT NULL );""" crsr.execute(sql_command) # 创建car_main表,model_id关联model表主键 sql_command = """CREATE TABLE IF NOT EXISTS car_main ( car_id INTEGER PRIMARY KEY, model_id INTEGER NOT NULL, FOREIGN KEY (model_id) REFERENCES model(model_id) );""" crsr.execute(sql_command) # 创建car_info表,外键分别关联car_main和model表的主键 sql_command = """CREATE TABLE IF NOT EXISTS car_info ( info_id INTEGER PRIMARY KEY AUTOINCREMENT, car_id INTEGER NOT NULL, model_id INTEGER NOT NULL, year INTEGER, price INTEGER, used INTEGER CHECK (used IN (0, 1)), FOREIGN KEY (car_id) REFERENCES car_main(car_id), FOREIGN KEY (model_id) REFERENCES model(model_id) );""" crsr.execute(sql_command) connection.commit() connection.close()
补充说明
- 添加
IF NOT EXISTS避免重复创建表时抛出错误。 - 给car_info表添加了自增主键
info_id,若你需要将car_id和model_id作为联合主键,可替换为PRIMARY KEY (car_id, model_id)。 - 用
INTEGER CHECK (used IN (0, 1))替代BOOLEAN类型,更贴合SQLite的实际存储逻辑(SQLite会将BOOLEAN转为INTEGER存储)。
内容的提问来源于stack exchange,提问作者PythonCoder
相关产品推荐
相关产品推荐

