我正在尝试将一行插入到引用其他表中的键的表中。在某些情况下,插入/选择将失败,因为所选值不能为空。我想知道哪些选择失败,以便我可以根据需要在其他表中创建必要的行。
下面的例子有点做作,但应该说明这里的挑战:
CREATE TABLE TableOne
(
TableOneId INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(64) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE TableTwo
(
TableTwoId INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(64) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE DependentTable
(
DependentId INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
TableOneId INT UNSIGNED NOT NULL,
TableTwoId INT UNSIGNED NOT NULL,
Value FLOAT NOT NULL,
FOREIGN KEY (TableOneId) REFERENCES TableOne(TableOneId),
FOREIGN KEY (TableTwoId) REFERENCES TableOne(TableTwoId)
) ENGINE=InnoDB;
INSERT INTO DependentTable (Value, TableOneId, TableTwoId) SELECT 1.0, TableOne.TableOneId, TableTwo.TableTwoId FROM TableOne,TableTwo WHERE TableOne.Value='TableOneValue' AND TableTwo.Value='TableTwoValue';
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
如果 'TableOneValue' 或 'TableTwoValue' 不存在,则 select 将返回 null 并插入 0 行 - 正如预期的那样。但是,我希望获得一些其他信息,这些信息可以让我确定哪个值不存在,以便我可以创建它。
问题是,至少在我的实际情况下,盲目地创建每个值来满足外键引用将是过度杀伤/昂贵的,因为有多个外键并且其中一些依赖表将具有其他必需的依赖关系。我想更智能地处理它并确定哪些引用不存在,而只创建那些引用。
我可以尝试在依赖表中一个接一个地创建行,等到实际插入一行(而不是获取重复条目),然后再次尝试原始插入 - 但感觉应该有更好/更多优雅的方式来做到这一点......
提前感谢您的任何建议/想法...