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

同时创建带外键关联的MySQL表问题:FK_palle值为0

解决外键FK_palle始终为0的问题

你遇到的核心问题其实很直白:在插入csvHoejde1数据时,你完全没有给FK_palle字段赋值,数据库自然会使用这个字段的默认值(也就是你看到的0)。要实现两张表的正确关联,你需要先拿到Palle_tbs插入后的自增ID,再把这个ID作为外键值传入csvHoejde1的插入操作中。下面是具体的解决方案:

步骤1:获取Palle_tbs插入后的自增ID

首先修改insertPalleTable方法,让它返回插入记录的自增id。假设你的数据库类基于PDO实现,可以通过lastInsertId()获取这个值:

public function insertPalleTable($latest_filename ,$palledata){
    $this->db->toList("INSERT INTO `Palle_tbs` (`Palle_nr`, `Varenummer`, `Ordre_nummer`, `Operatoer`, `Maskine_nr`, `Raavare_batch_nr`, `Dato_ur_stillet`,`Klokke_fuldsvejst`,`Fuldstoebning_af_klokke`,`Afgratning_af_overflade`,`Vaegt`) VALUES (:Palle_nr, :Varenummer, :Ordre_nummer, :Operatoer, :Maskine_nr, :Raavare_batch_nr, :Dato_ur_stillet, :Klokke_fuldsvejst, :Fuldstoebning_af_klokke, :Afgratning_af_overflade, :Vaegt)", [
        ':Palle_nr' => $palledata[0],
        ':Varenummer'=>$palledata[1],
        ':Ordre_nummer'=>$palledata[2],
        ':Operatoer'=>$palledata[3],
        ':Maskine_nr'=>$palledata[4],
        ':Raavare_batch_nr'=>$palledata[5],
        ':Dato_ur_stillet'=>$palledata[6],
        ':Klokke_fuldsvejst'=>$palledata[7],
        ':Fuldstoebning_af_klokke'=>$palledata[8],
        ':Afgratning_af_overflade'=>$palledata[9],
        ':Vaegt'=>$palledata[10]
    ] );
    // 返回插入记录的自增ID
    return $this->db->pdo->lastInsertId();
}

如果你的数据库类已经封装了获取自增ID的方法,直接调用对应方法即可。

步骤2:修改insertHoejde1Table方法,支持传入外键值

更新插入逻辑,添加FK_palle的参数和赋值:

public function insertHoejde1Table($latest_filename ,$getdata, $fkPalleId){
    return $this->db->toList("INSERT INTO `csvHoejde1` (`Name`, `Datum`, `Property`, `Criterion`, `Type`, `Nominal`, `Actual`,`Tolminus`,`Tolplus`,`Dev`, `FK_palle`) VALUES (:Name, :Datum, :Property, :Criterion, :Type, :Nominal, :Actual, :Tolminus, :Tolplus, :Dev, :FK_palle)", [
        ':Name' => $getdata[0],
        ':Datum'=>$getdata[1],
        ':Property'=>$getdata[2],
        ':Criterion'=>$getdata[3],
        ':Type'=>$getdata[4],
        ':Nominal'=>$getdata[5],
        ':Actual'=>$getdata[6],
        ':Tolminus'=>$getdata[7],
        ':Tolplus'=>$getdata[8],
        ':Dev'=>$getdata[9],
        ':FK_palle' => $fkPalleId // 传入关联的Palle_tbs ID
    ] );
}

步骤3:调整调用逻辑,传递外键ID

在addcsv.php中,先插入Palle_tbs拿到ID,再把这个ID传给insertHoejde1Table:

$csv->createPalleTable($latest_filename);
// 获取插入Palle_tbs后的自增ID
$palleId = $csv->insertPalleTable($latest_filename, array_map("toNumber", fgetcsv($openfile, 1000, ";")));
$csv->createHoejde1($latest_filename);
// 传入palleId作为外键值
$csv->insertHoejde1Table($latest_filename, array_map("toNumber", fgetcsv($openfile, 1000, ";")), $palleId);

额外检查:确保外键约束真正生效

还要确认你的表使用支持外键的存储引擎(比如InnoDB),MyISAM不支持外键约束。可以在创建表时明确指定:

// 修改createHoejde1方法,添加引擎和明确的外键声明
public function createHoejde1($latest_filename){
    return $this->db->toList("CREATE TABLE IF NOT EXISTS `csvHoejde1`(
        id INT(11) AUTO_INCREMENT PRIMARY KEY,
        Name VARCHAR(50),
        Datum VARCHAR(50),
        Property VARCHAR(50),
        Criterion VARCHAR(50),
        Type VARCHAR(50),
        Nominal DECIMAL(10,2),
        Actual DECIMAL(10,2),
        Tolminus DECIMAL(10,2),
        Tolplus DECIMAL(10,2),
        Dev DECIMAL(10,2),
        FK_palle INT(11),
        FOREIGN KEY (FK_palle) REFERENCES Palle_tbs(`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
}

这样能确保数据库会校验外键值的合法性,防止插入不存在的关联ID。

按照以上步骤修改后,csvHoejde1的FK_palle字段就会正确关联到Palle_tbs的对应记录ID,不再是默认的0了。

内容的提问来源于stack exchange,提问作者ShakyIpsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:59:04