【问题标题】:Sqlite update field if it containsSqlite 更新字段(如果包含)
【发布时间】:2010-09-14 04:29:48
【问题描述】:

给定一个名为“widget_ids”的数据库字段,其中包含“67/797/124/”或“45/”之类的数据,其中数字是斜线分隔的 widget_ids...您将如何使用 SQL 生成更新语句说: "如果 id X 行的 widget_ids 包含文本 "somenumber/" 则不执行任何操作,否则将 "somenumber/" 附加到它的当前值"

你能用 SQL 或者更具体地说是 sqlite 做类似的事情吗?出于某种原因,这是在程序中更好地完成的事情,还是在 SQL 中支持类似“if-then”的语法?

【问题讨论】:

    标签: sql database sqlite syntax


    【解决方案1】:

    更新有点像 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/%";
    

    【讨论】:

      【解决方案2】:

      首先,去掉符号分隔的列表。使用另一个表,每行有一个小部件 ID。

      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 是否引用 Widget 45:

      SELECT * FROM ThingieWidgets
      WHERE thingie_id = 1234 AND widget_id = 45;
      

      如果出现重复键错误,您可以尝试插入和恢复:

      INSERT INTO ThingieWidgets (thingie_id, widget_id)
        VALUES (1234, 45);
      

      【讨论】:

      • 好点,但不幸的是 sqlite 并没有真正支持外键强制执行。
      • 好吧,那你就不能声明外键了,不过还是把斜线分隔的字符串拆成一个规范化的表比较好。
      • 你是对的,我正要这样做,直到我意识到我所做的一切都是完全不必要的。我标记的帖子回答了我提出的问题,但如果有人支持,我会将此标记为“支持”或你有什么。但是我确实修改了它......
      • 谢谢,不用担心,这完全是为了分享信息。代表点和东西是次要的。 :-)
      • 较新版本的 SQLite 支持外键,另见:sqlite.org/foreignkeys.html
      猜你喜欢
      • 2019-03-12
      • 1970-01-01
      • 2019-12-13
      • 2018-09-13
      • 1970-01-01
      • 2021-02-10
      • 2011-11-22
      • 2019-01-10
      • 1970-01-01
      相关资源
      最近更新 更多