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

如何在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不满足该条件。
  • 外键约束未启用: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:10:49