Я застрял с ограничениями как SQLite, так и дизайна некоторых его таблиц. Вот чего я хотел бы достичь:
- Создать переменную для отслеживания количества итераций al oop. Затем используйте эту переменную, чтобы помочь создать уникальные строки таблицы во время l oop. Также вставьте его как значение счетчика букв в записи.
- Объедините указанную переменную с существующими строками, чтобы создать уникальные идентификаторы, на которые можно ссылаться несколько раз.
- L oop код с использованием предыдущей переменной для отслеживания итераций и предыдущих объединений в качестве идентификаторов для вставки новых строк для каждого l oop. 255 циклов - это произвольное число, я сомневаюсь, что мне понадобится 255 циклов в 99,9% случаев, но я хочу избежать ошибок в тех случаях, когда они необходимы. Я реально смотрю на минимум 50 петель, с 100 как редкий максимум. 200, вероятно, будет ближе к истинному максимальному числу выбросов. 255 просто для безопасности.
Вот что я пытался сделать до сих пор:
DECLARE @cnt INT = 1;
WHILE @cnt < 256
BEGIN
@seyield = 'BUILDING_STOCK_EXCHANGE_YIELD_' + @cnt;
@secitizens = 'BUILDING_STOCK_EXCHANGE_CITIZENS_' + @cnt;
@secount = 'COUNT_CITIZENS_' + @cnt;
INSERT INTO
BuildingModifiers (BuildingType, ModifierId)
VALUES
('BUILDING_STOCK_EXCHANGE', @seyield);
INSERT INTO
Modifiers (ModifierId, ModifierType, RunOnce, Permanent, SubjectRequirementSetId)
VALUES
(@seyield, 'MODIFIER_BUILDING_YIELD_CHANGE', 0, 0, @secitizens);
INSERT INTO
ModifierArguments (ModifierID, Name, Value)
VALUES
(@seyield, 'BuildingType', 'BUILDING_STOCK_EXCHANGE'),
(@seyield, 'Amount', '2'),
(@seyield, 'YieldType', 'YIELD_GOLD');
INSERT INTO
RequirementSets(RequirementSetId, RequirementSetType)
VALUES
(@secitizens, 'REQUIREMENT_TEST_ALL');
INSERT INTO
RequirementSetRequirements(RequirementSetId, RequirementId)
VALUES
(@secitizens, @secount);
INSERT INTO
Requirements(RequirementId, RequirementType)
VALUES
(@secount, 'REQUIREMENT_COLLECTION_ATLEAST');
INSERT INTO
RequirementArguments(RequirementId, Name, Value)
VALUES
(@secount, 'CollectionType', 'COLLECTION_CITY_PLOT_YIELDS'),
(@secount, 'Count', @cnt);
SET @cnt = @cnt + 1;
END;
Конечно, это не работает из-за ограничений SQLite.
Существуют ли какие-либо допустимые обходные пути для этого?
Мне известен один из них, но он практически невозможен: не указывайте переменную l oop, переменную и конкатенации, а также вручную скопируйте и вставьте этот код blo c, вручную меняя соответствующие поля каждый раз. Однако для этого потребуется 255 копий и вставок, умноженных примерно на 8 или 9 раз для каждого отдельного BUILDING_TYPE, к которому мне нужно присоединить строки. Я бы предпочел не делать этого, если есть более быстрый и эффективный способ!