php - 没有进入父表但 "0"或 "blank"插入子表中的 FK

标签 php mysql database

大家好,我正在尝试通过将数据插入父子表来解决一个问题。下表和 ERR 图显示了结构和 PK/FK key 。我从 webform 插入数据,PHP 用于捕获数据并将其传递到数据库。 mainTable 中的字段 - F_Name、L_Name 和 Email 只是输入文本字段, college 表中的字段是复选框。

想象一下,一位教师可以在一所、两所或三所大学任教,他会为他任教的每一所大学/学校勾选复选框。但如果他只在一所大学任教,那我的问题就来了。由于所有“学院”表都通过 PK/FK 链接到“教师”。

我的问题是,如果教师只在一所大学任教,是否有任何方法可以存储自动生成的大学 ID。目前我的 PHP 失败了,我不知道如何修复它。

我有一个Schema结构下的PHP示例。请注意,与数据库的连接正常工作。

如果已经有人问过这个或类似问题,我深表歉意。

感谢任何提示。

-------------------------------------------------------
-- Schema test
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET latin1 ;
USE `test` ;

-- -----------------------------------------------------
-- Table `test`.`CollegeA`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`CollegeA` (
  `CollegeAID` INT(11) NOT NULL AUTO_INCREMENT,
  `SchoolA` VARCHAR(45) NOT NULL,
  `SchoolB` VARCHAR(45) NOT NULL,
  `SchoolC` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`CollegeAID`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `test`.`CollegeB`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`CollegeB` (
  `CollegeBID` INT(11) NOT NULL AUTO_INCREMENT,
  `School1` VARCHAR(45) NOT NULL,
  `School2` VARCHAR(45) NOT NULL,
  `School3` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`CollegeBID`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `test`.`CollegeC`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`CollegeC` (
  `CollegeCID` INT(11) NOT NULL AUTO_INCREMENT,
  `School11` VARCHAR(45) NOT NULL,
  `School22` VARCHAR(45) NOT NULL,
  `School33` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`CollegeCID`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `test`.`Teacher`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`Teacher` (
  `TeacherId` INT(11) NOT NULL AUTO_INCREMENT,
  `F_name` VARCHAR(45) NOT NULL,
  `L_name` VARCHAR(45) NOT NULL,
  `Email` VARCHAR(45) NOT NULL,
  `CollegeAID` INT(11) NOT NULL,
  `CollegeBID` INT(11) NOT NULL,
  `CollegeCID` INT(11) NOT NULL,
  PRIMARY KEY (`MainId`),
  INDEX `CollegeAID_idx` (`CollegeAID` ASC),
  INDEX `CollegeBID_idx` (`CollegeBID` ASC),
  INDEX `CollegeCID_idx` (`CollegeCID` ASC),
  CONSTRAINT `CollegeAID`
    FOREIGN KEY (`CollegeAID`)
    REFERENCES `test`.`CollegeA` (`CollegeAID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `CollegeBID`
    FOREIGN KEY (`CollegeBID`)
    REFERENCES `test`.`CollegeB` (`CollegeBID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `CollegeCID`
    FOREIGN KEY (`CollegeCID`)
    REFERENCES `test`.`CollegeC` (`CollegeCID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

enter image description here

PHP 示例

if(empty($SchoolA) && empty($SchoolB) && empty($SchoolC)){

    $CollegeAId = "";

        }
        else {
            $queryCOLLEGEA = "
                INSERT INTO CollegeA (SchoolA, SchoolB, SchoolC)
VALUES('$SchoolA','$SchoolB','$SchoolC')";
                $result = mysqli_query($con, $queryCOLLEGEA);    
                $CollegeAId = mysqli_insert_id($con);
            };

if(empty($School1) && empty($School2) && empty($School3)){

    $CollegeBId = "";

        }
        else {
            $queryCOLLEGEB = "
                INSERT INTO CollegeB (School1, School2, School3)
VALUES('$School1','$School2','$School3')";
                $result = mysqli_query($con, $queryCOLLEGEB);    
                $CollegeBId = mysqli_insert_id($con);
            };

 if(empty($School11) && empty($School22) && empty($School33)){

    $CollegeCId = "";

        }
        else {
            $queryCOLLEGEC = "
                INSERT INTO CollegeB (School11, School22, School33)
VALUES('$School11','$School22','$School33')";
                $result = mysqli_query($con, $queryCOLLEGEC);    
                $CollegeCId = mysqli_insert_id($con);
            };

$queryMain = "
INSERT INTO Teacher (F_Name, L_Name, Email, CollegeAID, CollegeBID, CollegeCID) 
VALUES ('$F_Name', '$L_Name', '$Email', '$CollegeAId', '$CollegeBId', '$CollegeCId')";
    $result = mysqli_query($con, $queryMain);

最佳答案

您正在使用 NOT NULL 列作为外键。在这种情况下,您不能将其留空,您必须在此处设置引用表中的正确键。您可以将表定义更改为

CREATE TABLE IF NOT EXISTS `test`.`Teacher` (
  `TeacherId` INT(11) NOT NULL AUTO_INCREMENT,
  `F_name` VARCHAR(45) NOT NULL,
  `L_name` VARCHAR(45) NOT NULL,
  `Email` VARCHAR(45) NOT NULL,
  `CollegeAID` INT(11),
  `CollegeBID` INT(11),
  `CollegeCID` INT(11),
  PRIMARY KEY (`MainId`),
  INDEX `CollegeAID_idx` (`CollegeAID` ASC),
  INDEX `CollegeBID_idx` (`CollegeBID` ASC),
  INDEX `CollegeCID_idx` (`CollegeCID` ASC),
  CONSTRAINT `CollegeAID`
    FOREIGN KEY (`CollegeAID`)
    REFERENCES `test`.`CollegeA` (`CollegeAID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `CollegeBID`
    FOREIGN KEY (`CollegeBID`)
    REFERENCES `test`.`CollegeB` (`CollegeBID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `CollegeCID`
    FOREIGN KEY (`CollegeCID`)
    REFERENCES `test`.`CollegeC` (`CollegeCID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

在此表中,您可以将 NULL 值插入 CollegeAID、CollegeBID 和 CollegeCID。因此,如果教师在大学工作,它在适当的 CollegeID 中就会有值(value)。如果否 - CollegeID 将为 NULL。

您还需要更改您的代码。像这样更改您的代码

if(empty($SchoolA) && empty($SchoolB) && empty($SchoolC)){
    $CollegeAId = null;
}

所有三所大学。您需要 null,而不是空字符串。

这里还需要一个改动

$queryMain = "
    INSERT INTO Teacher (F_Name, L_Name, Email, CollegeAID, CollegeBID, CollegeCID) 
    VALUES ('$F_Name', '$L_Name', '$Email', '$CollegeAId', '$CollegeBId', '$CollegeCId')";

变量 $CollegeAId 现在包含正确的 NULL 值。但是这个查询会产生成

INSERT INTO Teacher (F_Name, L_Name, Email, CollegeAID, CollegeBID, CollegeCID) 
VALUES ('F_Name', 'L_Name', 'Email', '', 'CollegeBId', 'CollegeCId')

看到了吗?仍然是空字符串而不是 NULL!您需要更改查询字符串。它必须看起来像

INSERT INTO Teacher (F_Name, L_Name, Email, CollegeAID, CollegeBID, CollegeCID) 
VALUES ('F_Name', 'L_Name', 'Email', NULL, 'CollegeBId', 'CollegeCId')

例如,对于大学A,你可以这样做:

$CollegeAId = isset($CollegeAId) ? "'$CollegeAId'" : 'NULL';
$queryMain = "
    INSERT INTO Teacher (F_Name, L_Name, Email, CollegeAID, CollegeBID, CollegeCID) 
    VALUES ('$F_Name', '$L_Name', '$Email', $CollegeAId, '$CollegeBId', '$CollegeCId')";

关于php - 没有进入父表但 "0"或 "blank"插入子表中的 FK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36646747/

相关文章:

php - Laravel 8 storage/framework/cache/data/ee 文件夹将用户设置为root :root rather than apache:apache permission denied

php - 使用 PHP 和 MySQL 从数据库中删除单个行

mysql - Delphi - TSQLQuery 即使在被释放后也会在 MySQL 上留下进程

php - 如何指定 Doctrine 装置的数据库连接?

php - 按索引累积二维数组

javascript - 如何清除ajax响应

数据库设计 - 外键与主键相同?

mysql - 将表与数据库中的 BOOLEAN 进行比较

php - 使用ajax从php多次返回

php - 使用多个 where 条件构建 MySql 查询