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

时间:2015-07-10 16:47:11

标签: 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,其中客户端和员工有两个外键。 当我尝试将数据从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

3 个答案:

答案 0 :(得分:1)

显然,employee表中还有一个引用client_code表的client的外键,因此您只能使用已存在的client_codeclient表。
我不知道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_clientemployee都有外键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)

删除所有外键检查并简化数据库。 问题出在你的外键结构上。 仔细了解主键和外键。 在没有外键的情况下重新创建新数据库然后检查。