我想運行一個查詢插入:延誤的原因是外鍵約束
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