Heim > Fragen und Antworten > Hauptteil
if(!$workflow_entity = $em->getRepository('AlbatrossAceBundle:Workflow')->findByIdAndStatus($line[$titleArr['WorkflowStepID']],$line[$titleArr['WorkflowStatus']])){
$workflow_entity = new Workflow();
$workflow_entity->setWorkflowStatus($line[$titleArr['WorkflowStatus']]);
$workflow_entity->setWorkflowStepID($line[$titleArr['WorkflowStepID']]);
$em->persist($workflow_entity);
}
Ich überprüfe nur, ob die gleichen Daten bereits in der aktuellen Datenbank vorhanden sind,
In den einzufügenden Daten sind jedoch bereits mehrere Teile derselben Daten enthalten.
Während des Einfügevorgangs werden diese Informationen also bereitgestellt
Beim Ausführen von „INSERT INTO Workflow (Workflow_Step_ID, Workflow_Status) VALUES (?, ?)“ mit den Parametern [„10“, „Assigned“]:
SQLSTATE[23000]: Verletzung der Integritätsbeschränkung: 1062 Doppelter Eintrag „10-Assigned“ für Schlüssel „stepid_status_uniq“
uniqueConstraints:
stepid_status_uniq:
columns: [ workflow_step_id, workflow_status ]
Ich habe eine eindeutige Einschränkung in der Datenbank erstellt (ich weiß nicht, ob das richtig ist)
Aber die Daten, die jetzt eingefügt werden, enthalten dieselben Daten vor dem Flash
Woher weiß ich, dass die aktuellen Daten gegen die eindeutige Regel verstoßen haben, bevor ich sie in der Datenbank speichere?
高洛峰2017-05-16 16:46:44
你可以根据你的约束规则,在插入前先查询一次,比如按照你的例子,先查询
SELECT count(*) FROM workflow WHERE workflow_step_id='10' AND workflow_status='Assigned'
如果结果不为0,则说明继续插入会违反唯一规则。
当然,实际上并不推荐这么做,每次插入都去检查是很费资源的
你可以考虑使用
INSERT IGNORE INTO
然后在插入后检查affected_rows,如果返回为0说明数据插入失败,这时候再去进行检查是否违反了约束规则。
滿天的星座2017-05-16 16:46:44
你應該使用Validation,
http://symfony.com/doc/master/reference/constraints/UniqueEntity.html