Учитывая поле базы данных с именем "widget_ids", содержащее данные типа "67/797/124 /" или "45 /", где числа разделены косой чертой widget_ids ... как бы вы составили оператор обновления с SQL, который бы сказал: "если widget_ids строки с идентификатором X содержит текст" somenumber / ", ничего не делать, в противном случае добавить" somenumber / "к его текущему значению"
Можете ли вы сделать что-то подобное с SQL или, точнее, с sqlite? Это что-то, что лучше сделать в программе по какой-то причине, или есть поддержка синтаксиса типа «если-то» в SQL?


Обновления похожи на сами по себе if-thens, и в большинстве реализаций SQL также есть некоторая поддержка if-then. Простым решением может быть:
update <tablename>
set widget_id = widget_id + "somenumber/"
where row_id = X
and widget_id not like "%/somenumber/%"
and widget_id not like "somenumber/%";
Во-первых, избавьтесь от списка, разделенного символами. Используйте другую таблицу с одним идентификатором виджета на строку.
CREATE TABLE ThingieWidgets (
thingie_id INT REFERENCES Thingies,
widget_id INT REFERENCES Widgets,
PRIMARY KEY(thingie_id, widget_id)
);
Заполните таблицу значениями из списка, разделенного косой чертой:
INSERT INTO ThingieWidgets (thingie_id, widget_id)
VALUES (1234, 67), (1234, 797), (1234, 124);
Теперь вы можете проверить, ссылается ли Thingie 1234 на виджет 45:
SELECT * FROM ThingieWidgets
WHERE thingie_id = 1234 AND widget_id = 45;
Вы можете попробовать вставить и восстановить, если есть повторяющаяся ошибка ключа:
INSERT INTO ThingieWidgets (thingie_id, widget_id)
VALUES (1234, 45);
Хорошо, тогда вы не можете объявить внешние ключи, но все же лучше разбить строку, разделенную косой чертой, на нормализованную таблицу.
Вы правы, и я собирался это сделать, пока меня не осенило, что все, что я делаю, совершенно ненужно. Сообщение, которое я пометил, ответило на мой вопрос, когда я его задал, но если бы для него была поддержка, я бы отметил его как «поддерживающий» или что у вас есть. Однако я модифицировал его ...
Спасибо, не беспокойтесь, все дело в обмене информацией. Очки репутации и прочее второстепенно. :-)
Более новые версии SQLite поддерживают внешние ключи, см. Также: sqlite.org/foreignkeys.html
@ Рафаэль: Ага! Спасибо, что упомянули об этом. Как бы то ни было, SQLite 3.6.19 представила поддержку внешнего ключа в октябре 2009 года - более чем через год после того, как были написаны приведенный выше ответ и комментарии.
Хорошие моменты, но, к сожалению, sqlite не имеет реальной поддержки принудительного применения внешнего ключа.