没有进入父表但是" 0"或"空白"在子表

时间:2016-04-15 12:08:32

标签: php mysql database

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

想象一下,一位老师可以在一所,两所或三所大学任教,在那里他会检查他所教的每所大学/学校的复选框。但如果他只在一所大学任教,那么我的问题就来了。作为所有的"大学"表格链接到"教师"用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);

1 个答案:

答案 0 :(得分:1)

您使用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中具有价值。如果不是 - 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')";