MySQL外键值为NULL是否正常?如何设置外键为整数类型
MySQL外键字段空值问题解答
外键值为NULL是否正常?
默认属于合法行为。MySQL没有强制要求外键字段必须非空,空值用于表示当前记录暂时没有关联到引用表的对应行,符合可选关联的业务场景需求。只有外键字段填入非空值时,才会校验该值是否在引用表的主键中存在。
如何强制外键值为有效整数?
你当前代码新增外键列的逻辑仅指定了int类型,未加非空约束,所以新增的外键列默认所有行值为NULL,且支持后续插入时留空。根据你的业务需求可以选择以下两种方案:
方案1:强制所有记录必须有关联
修改create_fk函数中的加列语句,增加NOT NULL约束和合理默认值(注意默认值必须是引用表中已存在的主键值,若表内已有历史数据需先批量补全外键值再添加约束,否则会执行报错):
def create_fk(name1, name2, name3, name4): url = "mysql+pymysql://{user}:{password}@localhost/{db}" engine = create_engine(url.format(user='root', password='Fer458it', db='data_immo')) # 修改此处,添加NOT NULL和默认值 engine.execute(f"ALTER TABLE {name1} ADD COLUMN {name2} int NOT NULL DEFAULT 1, ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name4}) ON DELETE CASCADE") return
方案2:允许无关联,仅要求有值时为有效整数
你当前的外键字段本身已经是整数类型,仅支持填入NULL或者符合要求的整数值,无需修改表结构,插入数据时主动给外键字段赋值为引用表存在的整数主键即可。
额外代码修复提示
你的create_table函数存在变量名不一致的bug:函数入参为nam,但执行ALTER语句时用了变量name,会触发未定义变量报错,建议统一变量名:
def create_table(d_fr, name, typ, p_k): # 把nam改成name url = "mysql+pymysql://{user}:{password}@localhost/{db}" engine = create_engine(url.format(user='root', password='Fer458it', db='data_immo')) d_fr.to_sql(name=name, con=engine, if_exists='append', index=False, dtype=typ) engine.execute(f"ALTER TABLE {name} ADD COLUMN {p_k} INT AUTO_INCREMENT PRIMARY KEY") return
内容的提问来源于stack exchange,提问作者de Beyssac Olivier
相关产品推荐
相关产品推荐

