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,其中客户端和员工有两个外键。 当我尝试将数据从create_client插入到具有完全相同字段的employee时,会出现此问题。 我应该怎么做才能在一个表格中插入两个表格,即create_client和employee
UPDATE -
表格结构
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_client
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,公司名称剩余数据将存入employee表,例如emp_mobile,emp_email,emp_first_name,emp_last_name。
现在,当用户首次将数据输入create_client表时,会弹出此问题。
客户端和员工表用户之间的一切正常,能够使用Yii2动态表单小部件输入尽可能多的员工,但不能用于create_client
答案 0 :(得分:1)
显然,employee
表中还有一个引用client_code
表的client
的外键,因此您只能使用已存在的client_code
值client
表。
我不知道create_client
表的结构是什么样的,它的目的是什么,但根据你的信息,我假设你应该首先在client
中插入数据,然后在{{1最后在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
和employee
都有外键create_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
插入。除了使用两个相同的表,除了唯一键,您可以在Yii中而不是在MySQL中进行唯一验证。您可以在client_code
模型的tableName()
方法中指定表名。这将保留:
CreateClient
这应该允许您使用动态表单,客户端作为主模型,Employee作为项目模型。
答案 1 :(得分:1)
在使用IO Generator(型号)和MySQL的Yii2上,我发现了以下内容。
我见过SET''在具有导致"完整性约束违规的外键约束的字段上的更新SQL语句中,而不是SET NULL#34;。
我的"修复"是在模型中的外键字段上添加默认规则,如下所示:
public function rules()
{
return [
//
// your other rules
//
[['field_name_with_foreign_key'], 'default', 'value' => null],
];
}
希望这有助于某人。
答案 2 :(得分:-1)
删除所有外键检查并简化数据库。 问题出在你的外键结构上。 仔细了解主键和外键。 在没有外键的情况下重新创建新数据库然后检查。