php - Yii2-完整性约束违规 – yii\db\IntegrityException

标签 php mysql yii yii2

    Integrity constraint violation – yii\db\IntegrityException

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`jts`.`employee`, CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`client_code`) REFERENCES `client` (`client_code`))
The SQL being executed was: INSERT INTO `employee` (`client_code`, `company_name`, `emp_email`, `emp_mobile`, `emp_first_name`, `emp_last_name`) VALUES ('12345678', 'PVPPCOE', 'saurabhkulkarni2010@hotmail.com', '+449029792183', 'Saurabh', 'Kulkarni')
Error Info: Array
(
    [0] => 23000
    [1] => 1452
    [2] => Cannot add or update a child row: a foreign key constraint fails (`jts`.`employee`, CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`client_code`) REFERENCES `client` (`client_code`))
)

我有三个表Client、Employee和create_client,其中client和employee有两个外键。 当我尝试将数据从 create_client 插入到具有完全相同字段的员工时,就会出现此问题。 我应该怎么做才能同时插入两个表,即 create_client 和 employee

更新-

表结构

1)客户端

CREATE TABLE IF NOT EXISTS `client` (
  `id` int(11) NOT NULL,
  `client_code` varchar(11) NOT NULL,
  `company_name` varchar(45) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;

2)创建客户端

CREATE TABLE IF NOT EXISTS `create_client` (
  `id` int(11) NOT NULL,
  `client_code` varchar(11) NOT NULL,
  `company_name` varchar(45) NOT NULL,
  `emp_email` varchar(45) NOT NULL,
  `emp_mobile` varchar(45) NOT NULL,
  `emp_first_name` varchar(45) NOT NULL,
  `emp_last_name` varchar(45) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8;

3)员工

CREATE TABLE IF NOT EXISTS `employee` (
  `id` int(11) NOT NULL,
  `client_code` varchar(11) NOT NULL,
  `company_name` varchar(45) NOT NULL,
  `emp_email` varchar(45) NOT NULL,
  `emp_mobile` varchar(45) NOT NULL,
  `emp_first_name` varchar(45) NOT NULL,
  `emp_last_name` varchar(45) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

这是我的表结构,第一个用户将创建客户端,这意味着它将首先更新create_client。现在,如果用户愿意,他可以在一个客户端代码下添加多个员工,现在用户将从 Yii2 动态表单小部件更新员工表。 为了使用这个小部件,我创建了一个表调用客户端,它将仅存储 client_code 和公司名称,其余数据将进入员工表,例如 emp_mobile、emp_email、emp_first_name、emp_last_name。

现在当用户第一次将数据输入create_client表时就会弹出这个问题。

客户端和员工表之间一切正常,用户可以使用 Yii2 动态表单小部件输入任意数量的员工,但不适用于 create_client

最佳答案

显然您在 employee 中也有一个外键表引用 client_code client的表,所以只能使用client_code client 中已存在的值表。
我不知道create_client的结构是什么表的外观及其用途是什么,但根据您的信息,我认为您应该首先将数据插入 client ,然后在 employee最后在 create_client ,以便每个外键的值都存在于其各自的表中。

如果这不正确,请发布您的表结构以及可能导致此问题的数据或查询。

在评论后编辑:我假设您的表结构如下所示:

CREATE TABLE `create_client` (
  `client_code` INT UNSIGNED NOT NULL,
  `company_name` VARCHAR(255) NOT NULL,
  `emp_mobile` VARCHAR(255) NOT NULL,
  `emp_email` VARCHAR(255) NOT NULL,
  `emp_first_name` VARCHAR(255) NOT NULL,
  `emp_last_name` VARCHAR(255) NOT NULL,
  UNIQUE KEY `client_code` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `client` (
  `client_code` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `company_name` VARCHAR(255) NOT NULL,
  PRIMARY KEY `client_code` (`client_code`),
  CONSTRAINT `client_ibfk_1` FOREIGN KEY (`client_code`) REFERENCES `create_client` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `employee` (
  `client_code` INT UNSIGNED NOT NULL,
  `company_name` VARCHAR(255) NOT NULL,
  `emp_mobile` VARCHAR(255) NOT NULL,
  `emp_email` VARCHAR(255) NOT NULL,
  `emp_first_name` VARCHAR(255) NOT NULL,
  `emp_last_name` VARCHAR(255) NOT NULL,
  KEY `client_code` (`client_code`),
  CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`client_code`) REFERENCES `client` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

但是,我建议使用 client作为父表并将外键约束移至 create_client ,这样 employeecreate_client外键为client 。我还想将其标准化并摆脱 company_name在子表中:

CREATE TABLE `client` (
  `client_code` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `company_name` VARCHAR(255) NOT NULL,
  PRIMARY KEY `client_code` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `create_client` (
  `client_code` INT UNSIGNED NOT NULL,
  `emp_mobile` VARCHAR(255) NOT NULL,
  `emp_email` VARCHAR(255) NOT NULL,
  `emp_first_name` VARCHAR(255) NOT NULL,
  `emp_last_name` VARCHAR(255) NOT NULL,
  UNIQUE KEY `client_code` (`client_code`),
  CONSTRAINT `create_client_ibfk_1` FOREIGN KEY (`client_code`) REFERENCES `client` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `employee` (
  `client_code` INT UNSIGNED NOT NULL,
  `emp_mobile` VARCHAR(255) NOT NULL,
  `emp_email` VARCHAR(255) NOT NULL,
  `emp_first_name` VARCHAR(255) NOT NULL,
  `emp_last_name` VARCHAR(255) NOT NULL,
  KEY `client_code` (`client_code`),
  CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`client_code`) REFERENCES `client` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

下一个改进是使用 employee唯一和非唯一的表client_code插入。除了唯一键之外,您可以在 Yii 中而不是在 MySQL 中进行唯一验证,而不是使用 2 个相同的表。您可以在 tableName() 中指定表名CreateClient的方法模型 。这将保留:

CREATE TABLE `client` (
  `client_code` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `company_name` VARCHAR(255) NOT NULL,
  PRIMARY KEY `client_code` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `employee` (
  `client_code` INT UNSIGNED NOT NULL,
  `emp_mobile` VARCHAR(255) NOT NULL,
  `emp_email` VARCHAR(255) NOT NULL,
  `emp_first_name` VARCHAR(255) NOT NULL,
  `emp_last_name` VARCHAR(255) NOT NULL,
  KEY `client_code` (`client_code`),
  CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`client_code`) REFERENCES `client` (`client_code`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

这应该允许您使用动态表单,其中“客户”作为主模型,“员工”作为项目模型。

关于php - Yii2-完整性约束违规 – yii\db\IntegrityException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31346192/

相关文章:

Yii AccessRules 将参数传递给表达式中的回调函数

php - SELECT FROM 表 WHERE lastupdated = 最近更新

PHP在函数中添加多个JOIN方法

mysql - 需要从 SQL 注入(inject)中恢复的帮助

php - 使用关系订购 dropDownList?

php - Yii 1.1.x CDbHttpSession 错误 : CDbConnection failed to open the DB connection: could not find driver

javascript - 在来自 javascript/jquery 的选择选项值中设置双引号字符串,也可以从 javascript/jquery 获取

php - 使用包含点的字段名称序列化表单数据

php - 如何更改Linux文件系统中的文件排序?

Mysql Append表添加列