如何声明变量,运行循环以及执行其他自动化

时间:2013-08-15 23:45:25

标签: mysql sql procedure

我需要对数据库进行一些维护和更改。我不想编写PHP代码来执行此操作,我宁愿只是将一些代码插入到phpMyAdmin的SQL执行窗口中。

例如,我想设置表+1中所有行的ID值。但是因为它们是独一无二的,如果我试着说UPDATE table SET column_ID = column_ID +1它会对我大喊大叫,说它不能做重复的ID - 当然不是因为它会从ID 1开始,把它设置为2,但ID 2已经存在

所以我想继续做这样的事情:从ID 100开始,然后一直工作到1。

DECLARE @id_to_update = 100
WHILE @id_to_update >= 1
  BEGIN
    UPDATE table SET column_ID = column_ID +1 WHERE column_ID = @id_to_update
    @id_to_update = @id_to_update -1
  END

但这不一定是正确的语法......

所以这是我的问题:

  • 如何使上述查询正常工作?
  • 我应该了解什么是基本的 除了简单地选择,插入或之外的其他东西的mySQL语法 更新行?我的意思是创建变量,运行循环,做其他 编程程序......
  • 你有什么好的资源(教程)可以指点我吗? 我的意思是除了mySQL手册,因为我不够聪明,无法理解写的任何内容有...

修改 的 我为什么要这样做? 好吧,我的数据库系统仍然处于开发阶段,虽然我正在添加功能和改变现状 - 主要是因为我的应用程序正在增长,但也因为我正在获得更好的想法如何组织我的东西,我可能需要制作变化。

特别是在这个我正在更新一个设置定义的数据库,我在整个应用程序中访问。我正在添加一个值,ID已经使用auto_increment编号,但现在我添加的值应该在逻辑上位于顶部,ID为1。

因此,请将其视为我引用的颜色。而现在我有红色,黄色,绿色。现在购买我真的需要蓝色,蓝色实际上是最重要的颜色,所以我需要它排序在最顶层。

我从未指定任何外键,我只使用JOIN语句从数据库中提取数据。我不认为我的表在PHP之外互相交谈...

为什么我可能需要这样的技术的另一个例子是用于一般数据库管理和维护。同样强烈地决定了我的应用程序正在增长,而且我在BETA测试它时,我可能不得不改变一些东西,必须对数据进行一些批量编辑,我更愿意使用雾化函数(FOR ,WHILE等)然后点击进入每个字段并手动更改。

希望现在更有意义。

除此之外:嘿,即使它刹车我的东西,我只想知道如何让它发挥作用。如何在mySQL中运行代码。 再说一遍:我可以简单地用PHP编写,在PHP代码和数据库查询之间来回切换,但由于SQL似乎提供了编程命令,为什么不使用它们并省去上传和调试PHP脚本的麻烦,简单地插入代码直接进入phpMyAdmin ...想一个不同的例子,如果你喜欢! :d

2 个答案:

答案 0 :(得分:2)

MySQL流控制语句(例如,while,if等)只能在存储过程中完成(参见http://dev.mysql.com/doc/refman/5.0/en/flow-control-statements.html)。以下是有关如何创建存储过程的文档:http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

这是一个基本的存储过程示例,可帮助您入门:

DELIMITER $$

DROP PROCEDURE IF EXISTS `myProcedure` $$
CREATE PROCEDURE `myProcedure`() 

BEGIN
    DECLARE counter int(3) DEFAULT 0;

    WHILE (counter < 50) DO
        SELECT * from my_table where id = counter;

        set counter := counter +1;
    END WHILE;


END $$

然后你可以用:

来调用它
call my_schema.myProcedure();

请注意,我包含了“DROP PROCEDURE IF EXISTS”,因为在需要更新代码之前,需要先删除存储过程,然后再重新创建它们。

答案 1 :(得分:1)

我不确定你为什么要这样更改ID本身。关于你想要做什么的进一步解释会有所帮助。真的永远不应该改变身份证。

就查询而言,您可以像这样声明变量(对于MySQL中的用户定义变量,您不需要DECLARE)

SET @id_to_update = 100;

查询可能就是这样的

UPDATE table SET somecolumn = somecolumn + 1 
WHERE somecolumn BETWEEN 1 AND @id_to_update;

有很多东西需要学习,比如触发器,存储过程,索引,备份/恢复等等.W3schools是学习SQL(以及其他一些语言)的良好开端。你真的避免将查询写成循环。编写SQL时需要在集合中思考。