同时创建带外键关联的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
相关产品推荐
相关产品推荐

