我正在尝试创建一个存储过程,该过程将根据用户输入更新特定的行和列位置。我的表有大约100列,使用渐进增量的名称。 Ex Page1,Page2,Page3,Page 4 ....等。当用户完成每页的不同版本时,数据也必须以递增的增量进行更新。
当调用该过程时,我需要它来查找用户的行(Page1是键和唯一的),并将信息放在保存文件版本的位置到第一个NULL列中。我已经看到有关使用游标进行类似应用的讨论,但我不确定这是否是正确的解决方案。
----------------------------------------------------
| Page1 | Page2 | Page3 | Page4 |
----------------------------------------------------
| /pg1.htm | /pg2.htm | /pg3.htm | NULL |
----------------------------------------------------
| /pg1.doc | /pg2.doc | NULL | NULL |
----------------------------------------------------
| /pg1.pdf | NULL | NULL | NULL |
----------------------------------------------------
我需要在调用时每次使用一个数据顺序更新行的过程。我的问题是使这个可扩展,而不是用100 + IF语句限制它。
我编写的伪代码看起来像这样,但非常低效:
FIND ROW that matches unique key
LOOP Find_NULL
IF Column2 == NULL
UPDATE DATA HERE
ELSE IF Column3 == NULL
UPDATE DATA HERE
ELSE IF Column4 == NULL
UPDATE DATA HERE
ELSE IF.... and on and on
END LOOP Find_NULL
我正在使用MySQL,我被告知不支持动态SQL。我试图创建一个变量并在我浏览数据时修改它以存储下一个NULL列但是这不起作用。
如果有人有任何解决方案或建议我会很感激。
提前致谢。
答案 0 :(得分:3)
乍一看,您似乎遇到了相当差的数据库设计。
您不希望将列命名为“Page1”,“Page2”...“Page 100”,然后让这些列在很多时候都为NULL。这违反了声音数据库设计。您可能希望查看数据库规范化等概念(例如,第一范式,第二范围等)。
我认为你最好有一个名为“Page”的列,然后每行的值为1到100以及与页面相关的信息。这样,在形成插入/更新查询时,您无需尝试动态拼接列名称。
答案 1 :(得分:2)
我建议您将列转换为行。这样你只需要插入一个新行,效率更高。
该表将包含一个序列列,以保留值的顺序。
User,Seq,Val
1,1,/pg1.htm
1,2,/pg2.htm
1,3,/pg3.htm
2,1,/pg1.doc
2,2,/pg2.doc
3,1,/pg1.pdf
答案 2 :(得分:0)
你的桌子不在first normal form,因此你遇到了与设计问题密切相关的所有问题。
如果查看该链接,您会看到建议的解决方案是创建一个单独的表,将重复组链接到父实体(您当前的行)。在您的特定情况下,这意味着您将有一个单独的页面表,将页码(1,2,3,...,n)链接到此(父)表中的唯一键,并存储与该页面相关的数据在Pages表中。