将非主键递增变量插入 Sqlite 数据库
Insert Non-Primary Key Incrementing variable into Sqlite DB
我有一个矩阵 table 将两个对象连接在一起。
CREATE TABLE [TPS_TestPlanScenarioMatrix] (
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[testPlanID] INTEGER REFERENCES [TPS_TestPlan]([testPlanID]),
[scenarioID] INTEGER REFERENCES [TPS_Scenarios]([ID]));
测试计划包含一系列场景,并且可能包含同一场景的多个副本。我的程序现在需要允许用户确定每个测试计划中属于列表的场景的顺序。
我正在使用 Fluent-NHibernate 将我的 Sqlite 数据库 Table 映射到我项目中的实体。我当前的测试计划映射如下:
Table("TPS_TestPlan");
Id(x => x.Id).Column("testPlanID");
Map(x => x.Name).Column("testPlanName");
Map(x => x.Description).Column("testPlanDescription");
HasManyToMany(x => x.Scenarios)
.Table("TPS_TestPlanScenarioMatrix")
.ParentKeyColumn("testPlanID")
.ChildKeyColumn("scenarioID")
.Cascade.None();
为了允许用户指定场景的顺序,我已将 .AsList(index => index.Column("scenarioOrder"))
添加到我的测试计划映射中。
然后我尝试更改我现有的 Sqlite 矩阵 Table 并使用以下方法迁移到任何以前存在的测试计划场景连接中:
ALTER TABLE TPS_TestPlanScenarioMatrix RENAME TO tmp;
CREATE TABLE [TPS_TestPlanScenarioMatrix] (
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[testPlanID] INTEGER REFERENCES [TPS_TestPlan]([testPlanID]),
[scenarioID] INTEGER REFERENCES [TPS_Scenarios]([ID]),
[scenarioOrder] INTEGER);
INSERT INTO TPS_TestPlanScenarioMatrix(testPlanID,scenarioID,scenarioOrder)
SELECT testPlanID,scenarioID,
CASE WHEN EXISTS(SELECT testPlanID FROM TPS_TestPlanScenarioMatrix)
THEN (SELECT COUNT(testPlanID) FROM TPS_TestPlanScenarioMatrix)
ELSE 1
END as scenarioOrder
FROM tmp;
DROP TABLE tmp;
但 scenarioOrder 始终输入为 1,因为 SELECT COUNT 语句在每次插入后都不会重新计算。我需要映射到同一测试计划的每个场景都有一个从 1 到 N 的递增 scenarioOrder。对于每个新场景列表,ScenarioOrder 必须始终从 1 开始。
如何让 SELECT COUNT 在每次插入后重新计算,以便我的 table 最后有正确的递增 scenarioOrder?
要从子查询中获取不同的计数,您需要使用 correlated subquery。
在这种情况下,子查询计算当前测试计划的当前行之前有多少行,即排序是旧的 ID
:
INSERT ...
SELECT ...,
(SELECT COUNT(*)
FROM tmp AS t2
WHERE t2.testPlanID = tmp.testPlanID
AND t2.ID <= tmp.ID
) AS scenarioOrder
FROM tmp
我有一个矩阵 table 将两个对象连接在一起。
CREATE TABLE [TPS_TestPlanScenarioMatrix] (
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[testPlanID] INTEGER REFERENCES [TPS_TestPlan]([testPlanID]),
[scenarioID] INTEGER REFERENCES [TPS_Scenarios]([ID]));
测试计划包含一系列场景,并且可能包含同一场景的多个副本。我的程序现在需要允许用户确定每个测试计划中属于列表的场景的顺序。
我正在使用 Fluent-NHibernate 将我的 Sqlite 数据库 Table 映射到我项目中的实体。我当前的测试计划映射如下:
Table("TPS_TestPlan");
Id(x => x.Id).Column("testPlanID");
Map(x => x.Name).Column("testPlanName");
Map(x => x.Description).Column("testPlanDescription");
HasManyToMany(x => x.Scenarios)
.Table("TPS_TestPlanScenarioMatrix")
.ParentKeyColumn("testPlanID")
.ChildKeyColumn("scenarioID")
.Cascade.None();
为了允许用户指定场景的顺序,我已将 .AsList(index => index.Column("scenarioOrder"))
添加到我的测试计划映射中。
然后我尝试更改我现有的 Sqlite 矩阵 Table 并使用以下方法迁移到任何以前存在的测试计划场景连接中:
ALTER TABLE TPS_TestPlanScenarioMatrix RENAME TO tmp;
CREATE TABLE [TPS_TestPlanScenarioMatrix] (
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[testPlanID] INTEGER REFERENCES [TPS_TestPlan]([testPlanID]),
[scenarioID] INTEGER REFERENCES [TPS_Scenarios]([ID]),
[scenarioOrder] INTEGER);
INSERT INTO TPS_TestPlanScenarioMatrix(testPlanID,scenarioID,scenarioOrder)
SELECT testPlanID,scenarioID,
CASE WHEN EXISTS(SELECT testPlanID FROM TPS_TestPlanScenarioMatrix)
THEN (SELECT COUNT(testPlanID) FROM TPS_TestPlanScenarioMatrix)
ELSE 1
END as scenarioOrder
FROM tmp;
DROP TABLE tmp;
但 scenarioOrder 始终输入为 1,因为 SELECT COUNT 语句在每次插入后都不会重新计算。我需要映射到同一测试计划的每个场景都有一个从 1 到 N 的递增 scenarioOrder。对于每个新场景列表,ScenarioOrder 必须始终从 1 开始。
如何让 SELECT COUNT 在每次插入后重新计算,以便我的 table 最后有正确的递增 scenarioOrder?
要从子查询中获取不同的计数,您需要使用 correlated subquery。
在这种情况下,子查询计算当前测试计划的当前行之前有多少行,即排序是旧的 ID
:
INSERT ...
SELECT ...,
(SELECT COUNT(*)
FROM tmp AS t2
WHERE t2.testPlanID = tmp.testPlanID
AND t2.ID <= tmp.ID
) AS scenarioOrder
FROM tmp