精华内容
下载资源
问答
  • 在MySQL中我们经常使用当前表中ID最大值+1作为下一个插入元素的主键ID进行insert执行、当然是在不设置主键自增长的情况下、那么在操作同一张表的情况下insert....(select max(id) from table)等语句的时候我们就需要...

    背景

    在MySQL中我们经常使用当前表中ID最大值+1作为下一个插入元素的主键ID进行insert执行、当然是在不设置主键自增长的情况下、那么在操作同一张表的情况下insert....(select max(id) from table)等语句的时候我们就需要特别的注意。

    举例

    需求:查询出user表中主键ID最大值最为添加下一调数据的主键ID

    # table----> user
    # 完整语法
    insert into from user(id,name,age,email) values(id,name,age,email); 
    
    # 实际填充数据
    insert into from user(id,name,age,email) values((select max(id) from user),'zhangsan',22,'123@qq.com');
    

    执行语句报错

    You can't specify target table 'user' for update in FROM clause

    意思是不能再同一个表中查出数据又修改数据,所以要给表取个别名,避免错误。

    修改

    # 实际填充数据
    insert into from user(id,name,age,email) 
    values((select max(id) from user us),'zhangsan',22,'123@qq.com');
    

    添加别名即可!

    展开全文
  • hibernate主键生成策略

    2019-10-05 15:27:59
    主键按照数值顺序递增,使用当前实例中最大值加1作为主键。很明显,在生成主键的过程中要对表进行一次遍历,查询出最大的值 之后才能生成主键,同时,因为要比较出最大的值,因此在<id></id>中的type数...

    在hibernate中,提供了多种主键生成器(不同的数据库,不同的表结构使用的主键生成策略也不相同),查阅相关资料经过实验总结如下:

    1.increment

    主键按照数值顺序递增,使用当前实例中最大值加1作为主键。很明显,在生成主键的过程中要对表进行一次遍历,查询出最大的值

    之后才能生成主键,同时,因为要比较出最大的值,因此在<id></id>中的type数据类型必须为数值型,否则会产生异常。

    注:即使在程序代码中设置了主键,hibernate也会按照主键最大值加1的方法生成主键,而不会使用代码中设置的主键。

     

     

    采用increment后控制台打印出:

     

     

    同时表中的数据也发生了变化:

    从截图中可以看出increment的实现原理,先在表中查询最大主键值,然后加1生成新主键,这种方式很明显不适用于数据量较大的项目。

     

    2.assigned

    使用这种方法,主键要提前设置,hibernate不干预。在   save()   之前指定一个主键(也就是自行设置主键,例如注册账户)。

     

    3.identity

    利用数据库提供的主键生成机制,例如MySQL,sqlserver中的自动增长生成主键。如果在建表的时候没有设置主键自增长就会报错。

    修改表属性就好了。(varchar数据类型不支持自增长)


    4.native

    hibernate会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
    由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。

    (注:前提是数据库表中设置了主键自增,否则插入数据不成功;同时也要求主键数据类型为数值型)

     

    5.sequence

    采用数据库提供的sequence机制生成主键,Oracle中使用sequence(mysql不支持)

    http://www.cnblogs.com/yjmyzz/archive/2012/12/27/2835095.html

     

    6.uuid

    由hibernate基于128位唯一值算法,根据当前IP,时间,jvm启动时间,内部自增量产生等多个参数生成16进制数值

    (编码后以长度为32的字符串表示)作为主键。在一定程度上保持了产生ID的唯一性。

     

    因为是用长度为32的字符串表示,因此在配置文件中和JavaBean中ID对应的属性应为String类型。

     

    转载于:https://www.cnblogs.com/hello-daocaoren/p/5718756.html

    展开全文
  • -- 动态生成字母方式主键,A-Z 大于Z自动进位【26进制数值表示】 -- 参数:动态查询表和主键列 create or replace function charkey (tabName char, pkName... -- 表中查询当前主键最大值 v_char varchar2(4) :=
    -- 动态生成字母方式主键,A-Z 大于Z自动进位【26进制数值表示】
    
    
    -- 参数:动态查询表和主键列
    create or replace function charkey (tabName char, pkName char) return char
    as
      v_key varchar2(4);        -- 表中查询出当前主键列最大值
      v_char varchar2(4) := ''; -- 输出用变量
      v_len number(1);          -- 查询出最大值字符串长度
      v_i number(1);            -- 循环控制变量
      v_c char(1);              -- 提取单个字符变量
      v_flag number(1) := 1;    -- 是否'进位'变量
      v_count number;           -- 查询表中记录总数
    begin
       -- 查询表中记录数
       execute immediate 'select count(1) from ' || tabName into v_count;
      
       -- 如果表中没有记录,则返回'A'
       if (v_count = 0) then 
          v_char := 'A';
          return v_char;
       end if;
       
       -- 获取指定表中主键列当前最大值
       execute immediate 'select ' || pkName || ' from ' ||
       '(select rownum r, t.' || pkName || ' from ' ||
       '(select ' || pkName || ' from ' || tabName || 
       ' order by length(' || pkName || ') desc, ' || pkName || ' desc) t) where r < 2'
       into v_key;
       
       -- 字符串长度
       v_len := length(v_key);
       -- 循环控制变量
       v_i := v_len;
       
       -- 从最后一个字符开始,向前循环遍历
       while v_i >= 1 loop
         v_c := substr(v_key, v_i, 1);
         -- 如果需要进位,当前字符+1
         if(v_flag = 1) then
           v_c := chr(ascii(v_c)+1);
           v_flag := 0;
         end if;
         -- 当前字符超出上限
         if( ascii(v_c) > ascii('Z')) then
           v_c := 'A';
           v_flag := 1;
         end if;
         
         v_char := v_c || v_char;
         v_i := v_i - 1;
       end loop;
       -- 如果遇到ZZ情况,需要补充一位'A'
       if(v_flag = 1) then
         v_char := 'A' || v_char;
       end if;  
       return v_char;
    end;
    
    
    -- 测试表
    create table testtab
    (
       id varchar2(4) primary key,
       val number(4)
    );
    
    
    -- 测试通过函数动态生成主键插入数据
    declare
      v_count number(9) := 1;
    begin
      while v_count <= 30 loop
        
        insert into testtab values(charkey('testtab','id'), 1);  
      
        v_count := v_count + 1;
      end loop;
    end;
    
    
    
    
    select * from testtab;


    展开全文
  • 主键生成策略  主键不应该由用户自己输入,而是由程序生成。 (1)increment:自动...Hibernate底层使用查询一下表中主键最大值。select max(cust id ) from customer,然后将id+1作为当前主键。  问题:...

    主键生成策略
             主键不应该由用户自己输入,而是由程序生成。

    (1)increment:自动增长,使用的是Hibernate中提供的自动增长机制,适应于short,int,Long。Hibernate底层使用查询一下表中主键的最大值。select  max(cust id ) from customer,然后将id+1作为当前的主键。

                       问题:在集群中不要使用

    (2)identity:自动增长。使用的是数据库的自动增长机制。使用于有自动增长机制的机器。Oracle没有自动这增长功能。

    (3)sequence:序列,使用的是序列的方式完成数据库的主键的生成)(Oracle和DB2可以使用)

    (4)native:本地策略,根据数据库不同自动选择identity和sequence。

    (5)uuid:适用于字符串类型的主键,产生一个随机的字符串。

    (6)assigned:Hibernate不管理主键,用户手动设置主键的值
     

    展开全文
  • 第一步:先查询序列中的最大序列,select也会添加一次序列 第二步:设置序列的递增或递减值,当前序列为递减值为-215660 第三步:继续执行一次select,当前最大的序列会减去215660 第四步:还原序列的递增或递...
  • InnoDB引擎在5.7及之前将当前自增值存储在内存中,MySQL重启时从表中查询自增列最大值+步长作为当前自增值。 InnoDB引擎在8.0及之后版本中将自增值变动记录存储在redo log中,重启MySQL后根据redo log恢复之前的自...
  • 主键冲突的解决方案

    千次阅读 2010-03-01 16:28:00
    增量规则是查询当前表中的最大ID只,然后我们再生成一个比当前最大的再加1的一个增量。在单线程,数据量不大的时候没有任何问题。当我们测试时使用10个线程,用程序快速的发数据的时候,就出现了主键冲突。分析...
  • hibernate的几种主键

    2015-05-11 18:57:00
    public class generator extends ... * increment机制是int 查找当前id的最大值加1,两次查询效率底点 * Hibernate: select max(id) from Person Hibernate: insert into Person (name, id) values ...
  • 但是这个自增的序列号已经存在表中,比如写入的时候数据库给的id是10,但是表中已经有10这个id了,这个时候就会出现违反约束条件问题插入已存在的id,导致插入数据失败,可以查询当前插入的序列号确认是不是这类...
  • 针对主键,不需要手动给值,自动的值是当前表中该列最大值+1 关键字:auto_increment 自增长的特点: 1)只有整型数据列才能设置自增长 2)只有主键才会设置自增长 3)自增长列在插入数据时不用给值 4)初始...
  • AUTO_INCREMENT:自动自增,插入数据的时候,不需要设置编号,只需要设置为NULL,就会获取当前最大值然后加1插入。 注意事项:1.自增列,只能添加在主键列上 2.自增列允许手动赋值 #练习:编写脚本文件01_tedu....
  • 问题描述:序列生成的主键存在冲突 解决方案: //1,查询当前相关表的主键最大值 maxID SELECT max(id) maxID from srm_account //2,修改序列当前值为 maxID + 1
  • innodb引擎:Innodb表把自增主键的最大ID记录到内存中,重启数据库后,都会导致最大自增ID重置(会查询当前记录最大值)。 (据说8.0 会保存自增的最大ID到表里,待验证) MyISam引擎:MyISAM表会把自增主键的最大...
  • 修改Oracle序列

    2019-07-27 17:44:36
    数组库的主键Id用序列自动生成的,但是测试环境导入生产环境的数据库,而序列...-- 查询当前ID最大值 SELECT MAX(ID) FROM USER; -- 查询下一个序列 SELECT USER_SEQ.nextval FROM DUAL; -- 增加序列的步长 (n = ...
  • MySQL函数总结

    2020-10-11 18:17:55
    函数: version() # 用来查询当前数据库的版本 user() # 查询当前登录用户 database() # 查询当前所在的数据库 uuid() # 返回uuid的值,分布式情况下数据库主键不重复... max(列名称) # 最大值 min(列名称) ...
  • sql中提供了哪些好用的函数 version() # 用来查询当前数据库的版本 user() # 查询当前登录用户 database() # 查询当前所在的数据库 uuid() # 返回uuid的值,分布式情况下... max(列名称) # 最大值 min(列...
  • Redis缓存

    2018-11-02 11:38:53
    解决:在缓存中存储当前数据主键最大值 (自增),把所有主键的值放入缓存中 缓存雪崩:缓存中大量的数据在极短的时间到期 解决:让数据一部分一部分的到期 缓存穿刺:大量的请求访问数据库, 解决:加锁 ...
  • 一、sql中提供了哪些好用的函数 version() # 用来查询当前数据库的版本 user() # 查询当前登录用户 database() # 查询当前所在的数据库 ...max(列名称) # 最大值 min(列名称) # 最小值 sum(列名...
  • 2020-10-12

    2020-10-12 21:39:43
    MySQL的函数用法 1.version() # 用来查询当前数据库的版本 2.user() # 查询当前登录用户 3.database() # 查询当前所在的数据库 ...4.uuid() # 返回uuid的...6.max(列名称) # 最大值 7.min(列名称) # 最小值 ...
  • MySQL中常用的函数

    2020-10-12 15:27:05
    基本函数: version() 用来查询当前数据库的...max(列名称) 最大值 min(列名称) 最小值 sum(列名称) 求和 avg(列名称) 求平均数 数值型函数: abs(num) 求绝对值 sqrt(num) 开平方根 pow(x, y)/po
  • 数据库中常用的函数

    2020-10-13 20:24:55
    函数: 1、sql中提供的好用的函数 version() // 用来查询当前数据库的版本 ...max(列名称) // 最大值 min(列名称) // 最小值 sum(列名称) // 求和统计 avg(列名称) //求平均数 3、数值型函数: abs(num) //
  •  (1) 在service中,要生成主键,我们采取的策略是,先在主键工厂表中把当前最大主键查询出来,并让他加一,使这个为新插入业务表数据的主键:  TIdFactory idfactory= tIdFactoryDao.findById(map);    ...
  • 2020-12-03

    2020-12-03 15:13:18
    其主要用途是为表产生主键,可以在插入语句中使用,也可通过查询查看序列当前值,或者使序列变为下一个。 2.序列的创建 create sequence 序列名 increment by 1 --序列的步长为1 start with 1 --序列从1开始 ...
  • 你要的PostgreSQL命令

    2020-11-29 21:55:12
    ---------------------------*进入PostgreSQL查看数据库大小查看数据表大小查看索引大小查看表的索引查看数据库表的磁盘文件路径设置主键自增序列最大值(解决insert时主键冲突)查看当前正在执行的sql任务查询pg...
  • 使用kettle一次简单的增量同步

    千次阅读 2018-07-04 10:18:18
    主程序转换set_var获取目标表当前id最大值,存入变量中trans转换通过sql条件查询,获取更新的内容,再更新到目标表中4.运行主程序这种方式本质来说是通过sql条件查询,比较目标表和源表中不同的字段值,通过设置变量...
  • mysql的for update问题

    2016-06-12 13:55:02
    1、where 条件增加 主键<当前最大主键值 2、使用子查询把select pk from table where pk in (select pk from table where a in (3,5)) 都没有效果,为什么?!子查询反而好像整张表都锁了,所有insert都等待了 有...
  • sphinx增量索引

    千次阅读 2015-11-20 20:05:00
    当我们第一次使用indexer为表中内容建立索引后,当前表中内容都可以通过sphinxapi查询到。...我们可以建立一张表,专门用于存放已经建立索引的最大主键id;比如:第一次建立索引后,记录数据库表
  • 程序员的SQL金典1-8

    2011-05-20 18:09:38
     8.1.2 列查询  8.2 SELECT列表中的标量子查询  8.3 WHERE子句中的标量子查询  8.4 集合运算符与子查询  8.4.1 IN运算符  8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他...
  • 程序员的SQL金典7-8

    2011-05-20 18:30:04
     8.1.2 列查询  8.2 SELECT列表中的标量子查询  8.3 WHERE子句中的标量子查询  8.4 集合运算符与子查询  8.4.1 IN运算符  8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

查询当前主键最大值