我想运行一个查询插入:延误的原因是外键约束
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`)
(我不太清楚查询是正确的,但它似乎是工作),但我跑进以下问题。在创建“产品”表中的条目之前,我正在运行此查询,并且由于该条目尚未出现在产品表中,我正在获取外键约束问题。
我的问题是,是否有一种方法来运行此查询,但等到下一个查询(它更新产品表)执行上述查询的插入部分之前?另外需要注意的是,如果查询在产品条目创建后运行,它将不会再看到p。 Id
为空,因此失败,因此必须在创建产品条目之前执行。
--->编辑< --- 我想实现的概念如下: 对于初学者来说,我输入一组数据到一个临时表,该表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
Id
)
基本上我试图做到这一点是: 1 。任何时候在供应商数据集中显示新产品(或以前停用的产品)时,该记录都将作为“已激活”在ProductState表中创建。 2.任何时候产品(即已激活)都不会显示在供应商数据集中,该记录在ProductState表中创建为“已禁用”。
ProductState表的目的是跟踪产品的激活和停用状态。此外,ProductState与Product Table是多对一关系,产品的状态每天只会更改一次,因此我的PKEY将为ProductId和ChangedDate。
在一个侧面说明,是否有执行上的选择查询多个插入的方式(这可能是解决方案,插入到多个表与一个选择查询) – 2011-05-11 16:29:55
在插入产品之前需要插入ProductState的任何原因? – 2011-05-11 16:42:44
@tsOverflow我的逻辑(这可能是错误在这里),是一旦产品条目存在,上述查询将不再发现它为空(因为它存在),但再次与逻辑问题,如果它已经存在(但被停用),它也会在查询中失败。 – 2011-05-11 17:00:03