我正在 MySQL Workbench 中创建一个数据库。我在 EER 图中(在 Windows 中)创建了模式,之后转移到了 Linux,并进行了正向工程以获取 SQL 脚本。现在我正在测试数据库,但是我遇到了这个错误,这应该很简单,因为在一对一关系的子项中添加一行。
这些是插入语句:
INSERT INTO `DB_local`.`User` (`idUser`, `name`, `surname`, `gender`, `bornDate`, `address`, `city`, `postcode`, `telephone1`, `telephone2`, `email`) VALUES ('1', '1', '1', '1', '2020/01/01', '1', '1', '1', '1', '1', '1');
运行正常
INSERT INTO `DB_local`.`UserAdditionalDetails` (`idUser`, `cardNumber`, `userHash`, `entryDate`, `member`, `section`) VALUES ('1', '1', '1', '2020/01/01', '1', '1');
这得到了错误:
错误 1452:1452:无法添加或更新子行:外键约束失败(
DB_local
.UserAdditionalDetails
, CONSTRAINTfk_UserAdditionalDetails_User1
FOREIGN KEY (idUser
) REFERENCESUser
(idUser
) ON DELETE NO ACTION ON UPDATE NO ACTION)
知道为什么这个简单的 INSERT 不能按预期工作吗?
我搜索了它,我在其他问题中看到人们建议将 AdditionalDetails 数据“移动”到 User 表(出于设计原因,我宁愿避免),或者在插入该表之前禁用参考完整性(它是一个黑客,因为它应该可以正常工作)。
为了添加更多上下文,这是为创建数据库的该部分而生成的代码(数据库要复杂得多):
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema DB_local
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `DB_local` ;
-- -----------------------------------------------------
-- Schema DB_local
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `DB_local` DEFAULT CHARACTER SET utf8 ;
USE `DB_local` ;
-- -----------------------------------------------------
-- Table `DB_local`.`User`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `DB_local`.`User` ;
CREATE TABLE IF NOT EXISTS `DB_local`.`User` (
`idUser` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(25) NOT NULL,
`surname` VARCHAR(75) NULL,
`gender` VARCHAR(25) NULL,
`bornDate` DATE NULL,
`address` VARCHAR(300) NULL,
`city` VARCHAR(50) NULL,
`postcode` VARCHAR(5) NULL,
`telephone1` VARCHAR(10) NULL,
`telephone2` VARCHAR(10) NULL,
`email` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idUser`))
ENGINE = MyISAM;
-- -----------------------------------------------------
-- Table `DB_local`.`UserAdditionalDetails`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `DB_local`.`UserAdditionalDetails` ;
CREATE TABLE IF NOT EXISTS `DB_local`.`UserAdditionalDetails` (
`idUser` INT NOT NULL,
`cardNumber` VARCHAR(12) NOT NULL,
`userHash` VARCHAR(45) NOT NULL,
`entryDate` DATE NOT NULL,
`member` VARCHAR(45) NULL,
`section` VARCHAR(45) NULL,
PRIMARY KEY (`idUser`),
INDEX `fk_UserAdditionalDetails_User1_idx` (`idUser` ASC),
CONSTRAINT `fk_UserAdditionalDetails_User1`
FOREIGN KEY (`idUser`)
REFERENCES `DB_local`.`User` (`idUser`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
... MORE TABLES ...
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;