Mysql按位运算自增

Mysql按位运算自增,第1张

MYSQL没有这样的功能,自增只能每次增加1,我们只可以控制初值为多少,无法指定增长规律。

但是你的这个需求比较特殊,你可以使用系统功能产生一个1、2、3这有点自增列(例如id),你需要列值实际上是一个计算字段(2^(id-1)):2的id-1次方

MYSQL可以使用移位运算,例如:

SELECT id,2<<(id-1) FROM tab

如何在MYSQL插数据ID自增的方法。

如下参考:

1在添加字段之前,第一个应该首先检查当前tb1表的结构,如下图所示。

2实例字段列添加到表,如下所示。

3再次看表结构和比较之前和之后的情况添加字段,如下图所示。

4最后,插入新的数据行看到的样子,最后添加自动增长的字段,如下所示。

注意事项:

MySQL使用的SQL语言是访问数据库最常用的标准语言。MySQL软件采用双重许可政策,分为社区版,商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特性,一般中小网站开发选择MySQL作为数据库。

thisemployee_id = employee_id;}} 其它几个属性的getter和setter省略,这里我们要用到ejb3-persistencejar,JPA的注解类就在这个包中,下面详细说明上面使用到的注解。@Entity:通过@Entity注解将一个类声明为一个实体bean@Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名)@Id:用于标记属性的主键@Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如:@Column(name = EMPLOYEE_NAME)private String employee_name; 或者@Column(name = EMPLOYEE_NAME)public String getEmployee_name() {return employee_name;} 这两种方式都是正解的,根据个人喜好来选择。大象偏向于第二种,并且喜欢将属性名与字段名设成一样的,这样可以省掉@Column注解,使代码更简洁。@TableGenerator:表生成器,将当前主键的值单独保存到一个数据库表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式是很常用的。这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。大象推荐这种方式管理主键,很方便,集中式管理表的主键,而且更换数据库不会造成很大的问题。各属性含义如下:name:表示该表主键生成策略的名称,这个名字可以自定义,它被引用在@GeneratedValue中设置的generator值中table:表示表生成策略所持久化的表名,说简单点就是一个管理其它表主键的表,本例中,这个表名为GENERATOR_TABLEpkColumnName:表生成器中的列名,用来存放其它表的主键键名,这个列名是与表中的字段对应的pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义滴valueColumnName:表生成器中的列名,实体表主键的下一个值,假设EMPLOYEE表中的EMPLOYEE_ID最大为2,那么此时,生成器表中与实体表主键对应的键名值则为3allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50@GeneratedValue:定义主键生成策略,这里因为使用的是TableGenerator,所以,主键的生成策略为GenerationTypeTABLE,生成主键策略的名称则为前面定义的”tab-store”。这里大象想说下,网上有很多文章写的是strategy = GenerationTypeAUTO或是strategy = GenerationTypeSEQUENCE,采用SEQUENCE序列是因为Oracle数据中不支持identity自动增长,要想使用它,还得在数据库中创建一个序列,如果要更换数据库,那将是一个非常麻烦的事情。SEQUENCE生成方式我们暂且不谈,这里说下采用AUTO和IDENTITY的生成方式,本例采用的是SQL Server 2000作为数据库,所以如果想使用AUTO或是IDENTITY生成策略,则一定要对主键加上identity标识,如identity(1,1)。不过对于AUTO来说,是根据不同的数据库选择最合适的自增主键生成策略。如果使用MySQL,则主键要定义AUTO_INCREMENT,如果是Oracle,则要创建Sequence来实现自增。不管采用何种生成策略,增、删、改这些方法中一定要加入事务,否则数据是不会添加到数据库中滴~~~这是大象反复测试过的结果!

去"O"的业务支撑的时候,遇到一个开发询问如何获取到MySQL 的自增id,这里做一个总结,我们可以通过四种方式来获取MySQL 的自增id。

一 last_insert_id()

官方介绍如下:

“The ID that was generated is maintained in the server on a per-connection basis This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions ”

last_insert_id() 单个会话中最近一次执行的insert语句时表的自增id的值。不受其他的会话插入影响。

如果是新建的表,它的值为0

root@rac3 [yangyi]> create table t2(id int not null auto_increment primary key ,col varchar(10));

Query OK, 0 rows affected (011 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 0 |

+------------------+

1 row in set (001 sec)

如果向表中插入的记录,id自增,它的值为max(id),如果指定插入的id ,它的值为上一次插入的最大值。

root@rac3 [yangyi]> insert into t3 values(null,'sss');

Query OK, 1 row affected (000 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 1 |

+------------------+

1 row in set (000 sec)

root@rac3 [yangyi]> insert into t3 values(2,'sss');

Query OK, 1 row affected (000 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 1 |

+------------------+

1 row in set (000 sec)

使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 3 |

+------------------+

1 row in set (001 sec)

root@rac3 [yangyi]> insert into t1 values(null,'sss'),(null,'dd'),(null,'aaa');

Query OK, 3 rows affected (000 sec)

Records: 3 Duplicates: 0 Warnings: 0

root@rac3 [yangyi]> select from t1;

+----+------+

| id | col |

+----+------+

| 1 | sss |

| 2 | sss |

| 3 | sss |

| 4 | sss |

| 5 | dd |

| 6 | aaa |

+----+------+

6 rows in set (000 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 4 |

+------------------+

1 row in set (000 sec)

last_insert_id 是与表无关的,如果向表a插入数据后,再向表b插入数据,last_insert_id 返回表b的Id值!

root@rac3 [yangyi]> insert into t2 values(null,'sss');

Query OK, 1 row affected (000 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 11 |

+------------------+

1 row in set (000 sec)

root@rac3 [yangyi]> insert into t1 values(null,'sss');

Query OK, 1 row affected (000 sec)

root@rac3 [yangyi]> select @@identity;

+------------+

| @@identity |

+------------+

| 3 |

+------------+

1 row in set (000 sec)

二 使用@@identity

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。

其特性last_insert_id 一样

三 使用max(id)

select max(id) from tab; 返回的是tab 的最大id值。

使用max(id) 只能针对单个表获取最大的id,而且高并发情况下,必须加上'X' 锁才能获取会话当前的最大id,显然加锁会严重影响并发性能。

四 查看表结构

root@rac3 [yangyi]> show table status like 't3' \G

1 row

Name: t3

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 2

Avg_row_length: 8192

Data_length: 16384

Max_data_length: 0

Index_length: 0

Data_free: 0

Auto_increment: 3

Create_time: 2014-05-06 20:36:00

Update_time: NULL

Check_time: NULL

Collation: utf8_bin

Checksum: NULL

Create_options:

Comment:

1 row in set (000 sec)

root@rac3 [yangyi]> show create table t3 \G

1 row

Table: t3

Create Table: CREATE TABLE `t3` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`col` varchar(10) COLLATE utf8_bin DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

1 row in set (000 sec)

五 总结

我们知道MySQL 使用auto_increment 属性来实现自增id,这点与oracle 的sequence 不同,auto_increment 是基于表的而非全局。从oracle 到mysql 的dba 要注意改变对sequence 使用方式的转变。

就我所知这个好像无法实现,就算你自己编译mysql恐怕也很难。因为last_insert_id()这个内置的函数返回最近一次插入的自增长ID,当没有符合条件的ID时,它返回0,所以如果自增长从0开始的话,这个返回值就很难判定到底是插入了一条自增长ID为0的记录还是没有符合条件的记录了。

以上就是关于Mysql按位运算自增全部的内容,包括:Mysql按位运算自增、如何在MYSQL插数据 ID自增、如何获得mysql数据库自增长主键的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9336910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存