Inserção atrasada devido a restrições de chave estrangeira
Estou tentando executar uma consulta:
INSERT
INTO `ProductState` (`ProductId`, `ChangedOn`, `State`)
SELECT t.`ProductId`, t.`ProcessedOn`, \'Activated\'
FROM `tmpImport` t
LEFT JOIN `Product` p
ON t.`ProductId` = p.`Id`
WHERE p.`Id` IS NULL
ON DUPLICATE KEY UPDATE
`ChangedOn` = VALUES(`ChangedOn`)
(Não tenho certeza de que a consulta esteja correta, mas parece estar funcionando), no entanto, estou executando o seguinte problema. Estou executando esta consulta antes de criar a entrada na tabela 'Produtos' e estou tendo um problema de restrição de chave estrangeira devido ao fato de a entrada ainda não estar na tabela Produtos.
Minha pergunta é: existe uma maneira de executar essa consulta, mas aguarde até a próxima consulta (que atualiza a tabela Produto) antes de executar a parte de inserção da consulta acima? Observe também que, se a consulta for executada após a criação da entrada do produto, ela não verá mais as páginas p.Id
como nulo e, portanto, falhando, portanto, ele deve ser executado antes da criação da entrada do Produt
---> Editar <--- O conceito que estou tentando alcançar é o seguinte: Para começar, estou importando um conjunto de dados para uma tabela temporária, oProduct
table é uma lista de todos os produtos que foram (ou foram no passado) adicionados por meio do conjunto de dados da tabela temporária. O que eu preciso é de uma tabela separada que forneça uma alteração de estado no produto, pois às vezes o produto fica indisponível (não está mais no conjunto de dados fornecido pelo fornecedor
A tabela ProductState é a seguinte:
CREATE TABLE IF NOT EXISTS `ProductState` (
`ProductId` VARCHAR(32) NOT NULL ,
`ChangedOn` DATE NOT NULL ,
`State` ENUM('Activated','Deactivated') NULL ,
PRIMARY KEY (`ProductId`, `ChangedOn`) ,
INDEX `fk_ProductState_Product` (`ProductId` ASC) ,
CONSTRAINT `fk_ProductState_Product`
FOREIGN KEY (`ProductId` )
REFERENCES `Product` (`Id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
A chave estrangeira é um relacionamento de identificação com a tabela Produto Product
.Id
)
Essencialmente, o que estou tentando realizar é o seguinte: 1. Sempre que um novo produto (ou produto anteriormente desativado) aparece no conjunto de dados do fornecedor, o registro é criado na tabela ProductState como 'Ativado'. 2. Sempre que um produto (ativado) não aparece no conjunto de dados do fornecedor, o registro é criado como 'Desativado' na tabela ProductStat
O objetivo da tabela ProductState é rastrear os estados de ativação e desativação de um produto. Além disso, o ProductState é um relacionamento Multifuncional com a Tabela do produto, e o estado do produto será alterado apenas uma vez por dia; portanto, meu PKEY seria ProductId e ChangedDate.