Я пытаюсь выполнить запрос:
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`)
(я не совсем уверен, что запрос правильный, но, похоже, он работает), однако я сталкиваюсь со следующей проблемой. Я выполняю этот запрос перед созданием записи в таблице «Продукты» и получаю проблему ограничения внешнего ключа из-за того, что записи еще нет в таблице «Продукты».
У меня вопрос: есть ли способ выполнить этот запрос, но подождать до следующего запроса (который обновляет таблицу Product), прежде чем выполнять вставленную часть запроса выше? Также следует отметить, что если запрос выполняется после создания записи Product, он больше не будет видеть p. Id
как нулевой и, следовательно, сбой, поэтому его необходимо выполнить до создания записи Product.
---> Редактировать <---
Концепция, которую я пытаюсь реализовать, заключается в следующем:
Для начала я импортирую набор данных во временную таблицу, таблица <code>Product представляет собой список всех продуктов, которые были (или были в прошлом) добавлены через набор данных из временной таблицы. Мне нужна отдельная таблица, в которой представлено изменение состояния продукта, поскольку иногда продукт становится недоступным (больше не в наборе данных, предоставленном поставщиком).
Таблица ProductState выглядит следующим образом:
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;
Внешний ключ является идентифицирующей связью с таблицей Product (Product
. Id
)
По сути, я пытаюсь сделать следующее:
1. Каждый раз, когда новый продукт (или ранее деактивированный продукт) появляется в наборе данных поставщика, запись создается в таблице ProductState как «Активировано».
2. Каждый раз, когда продукт (который активирован) не отображается в наборе данных поставщика, запись создается как «Деактивированная» в таблице ProductState.
Цель таблицы ProductState - отслеживать состояния активации и деактивации продукта. Также ProductState является отношением Multi-To-One к Таблице продуктов, и состояние продукта будет меняться только один раз в день, поэтому мой PKEY будет ProductId и ChangedDate.