MySQL字段自增自减的SQL语句

亲测可用,若有疑问请私信

MySQL的自增语句大家应该都很熟悉 也很简单

update `info` set `comments` = `comments`+1 WHERE `id` = 32

这样就可以了,但是有时候我们会涉及到做减法,

例如:文章的评论数,在删除或者锁定了一条评论之后需要对该文章总评论数减一

comments smallint(5) unsigned 文章评论总数统计字段 无符号即 0 ~ 65535 之间的数值

1. 通常情况下是可以类似上面自增的方法 把 +号 改成 -号 就行了,但问题是如果当前 comments 统计数值为 0 时 再做减法将会变成该字段类型的最大数值 65535
update `info` set `comments` = `comments`-1 WHERE `id` = 32

2. 为避免这个问题一般的想法只能是先根据 id 主键查询出文章 comments 统计字段值,再通过PHP做减法,然后再 update 一次,前后总共需要执行两次SQL命令

今天google查了下没找到这方面的资料,看了看MySQL的语法函数等等。。。试了下面的语句可以直接一条语句完成,也就是加个 if 判断,如下示例:

update `info` set `comments` = IF(`comments`< 1,0,`comments`-1) WHERE `id` = 32

默认comments为0时, comments-1 = 65535;但测试了下 如果直接 判断 comments-1=65535 好像不行,不知道什么原因,对这个不是很熟悉不知道是不是 这里的 if 不支持 = 号,但是 comments-1 >= 65535 可以成立,于是当 comments 为 0 时,IF(`comments`-1>=65535,0,`comments`-1) 将返回 0提示:最大数值 65535 是 smallint 无符号状态下的最大值,其他字段类型请进行相应调整
----------------------------------------------------------------------------------------------------------------------
2014/02/03 补充:刚开始是这么写的,后来发现太笨了,稍微改下:

update `info` set `comments` = IF(`comments`<1, 0, `comments`-1) WHERE `id` = 32

要减x,就判断是否小于x
 

### 设置主键自SQL语句MySQL 中,可以通过 `AUTO_INCREMENT` 属性为表中的某个字段设置为主键并启用自动递功能。以下是几种常见的场景及其对应的 SQL 语句: #### 创建新表时设置主键自 当创建一张新表时,可以直接通过定义字段属性的方式指定该字段作为主键,并开启自动递功能。 ```sql CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ); ``` 上述语句会创建一个名为 `example_table` 的表,其中包含两个字段:一个是具有自动递特性的整数型主键 `id`,另一个是字符串类型的 `name` 字段[^1]。 --- #### 对已存在的表添加自主键 如果已经存在一张没有主键或者需要修改其结构的表,则可以使用 `ALTER TABLE` 语句为其添加带有自动递特性的主键。 假设有一张名为 `ucenter_member` 的表,当前缺少主键或希望重新配置主键为自模式,可通过如下命令完成操作: ```sql -- 添加一个新的自主键列 ALTER TABLE ucenter_member ADD id INT AUTO_INCREMENT PRIMARY KEY; ``` 此方法适用于那些尚未拥有任何主键约束的情况;它会在原有基础上追加一列命名为 `id` 的整数值,并赋予其唯一性和逐步加的能力[^5]。 另外还有一种情况就是原表格里已经有某些数据记录但缺乏明确标识符的时候也可以采用这种方法来进行改造升级从而满足实际需求当中对于每条独立信息都需要具备独一无二编号的要求[^3]。 --- #### 调整现有主键为非自状态或其他变更 有时候可能因为业务逻辑调整等原因而不再需要某特定列保持持续上升趋势的话则需要用到下面这条指令来移除掉之前设定好的这种特性: ```sql ALTER TABLE tableName MODIFY id INT UNSIGNED NOT NULL COMMENT '主键'; ``` 这里我们将原有的带量性质转换成了普通的无符号整形变量形式而不涉及其他额外参数选项设置了说明文字部分以便于后续维护人员理解此处设计意图所在[^2]. 需要注意的是执行此类动作前最好先备份原始资料以防万一发生意外丢失不可恢复等问题. --- ### 自动递值的相关控制 除了基本的功能之外还可以进一步定制化初始起点以及每次跳跃幅度大小等细节方面的东西比如: - **更改默认开始位置**: 如果不想让序列号从常规的一位数字起步而是更倾向于别的更大一些的位置那么就可以利用这样的语法格式来做相应改动. ```sql ALTER TABLE your_table_name AUTO_INCREMENT = desired_start_value; ``` - **查看当前系统的全局配置状况** 可以运行以下查询了解服务器端有关这方面的一些基本信息 ```sql SHOW VARIABLES LIKE '%auto_increment%'; ``` 这些都会返回类似如下的结果集展示出来供参考决策之用: +-------------------------------|-------+ |Variable_name |Value | +-------------------------------|-------+ |auto_increment_increment |1 | |auto_increment_offset |1 | +-------------------------------|-------+ 这意味着除非特别指定了不同的偏移量与间隔距离外一般情况下都是按照简单线性关系依次排列下去不会跳过任何一个中间环节[^4]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值