您的位置:首页 > 数据库 > Oracle

关于oracle和mysql 主键自增的小知识

2017-02-27 18:30 337 查看
1:ORACLE

一、主键id自增
oracle 中不能设置自动增加,这个和其他数据库不一样,但是有 序列,这个是Oracle自己特有的东西,
1、首先创建序列:create sequence seq;

语法:
CREATE SEQUENCE 序列名
[INCREMENT BY n]     --每次加几
[START WITH n]         --序列从几开始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --小值、大值限制
比CREATE SEQUENCE seq start with 1 increment by 1;   --建立了额从1开始每次加1序列
访问序列时用  序列名称.nextval语法

这就创建好了,然后 seq.nextval 就会返回一个值,不会重复的值,

insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');

这样前3个id 分别是 1,2,3

二、自动生成UUID策略

import java.util.UUID;

Student s = new Student();
s.setId(UUID.randomUUID().toString());

2:MYSQL

主键自增:

CREATE TABLE   test

(

id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(15) NOT NULL

)AUTO_INCREMENT = 100;

可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。

alter table tbname auto_increment = x ;

设置表tbname的唯一auto_increment字段起始值从x开始,如果此表数据量很多的话,这样执行起来会很慢

AUTO_INCREMENT说明:

(1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。

(2)把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。

(3)当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。

(4)当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。

(5)如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。

mysql> insert into testvalues(1,'a'),(2,'b'),(null,'c');

Query OK, 3 rows affected (0.00 sec)

Records: 3 Duplicates: 0  Warnings: 0

 

mysql> select * From test;

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

| id | username |

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

|   1| a        |

|   2| b        |

| 100 | c       |

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

3 rows in set (0.00 sec)

 

修改某一列为自增:

mysql> alter table test change id  id int AUTO_INCREMENT;

mysql> create table t24(id int,namechar(10));

mysql> alter table t24 add primarykey(id); //添加主键

mysql> alter table t24 modify id intauto_increment;//加入自动增加

 

/**删除主键唯一约束,还原到建表时的状态*/

mysql> alter table t24 modify id int; //去掉auto_increment

mysql> alter table t24 drop primary key;

mysql中有自增长字段,在做数据库的主主同步时需要在参数文件中设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。
auto_increment_offset表示自增长字段从那个数开始,他的取值范围是1 .. 65535
auto_increment_increment表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535

在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,而要把auto_increment_offset分别配置为1和2.这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。

插入数据记录
insert into userInfo values(1,'aaa','1212');
1

当数据表中有自增长主键时,当用SQL插入语句中插入语句带有ID列值记录的时候; 
如果指定了该列的值,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值;
也可以不指定该列的值,只将其他列的值插入,让ID还是按照MySQL自增自己填; 
这种情况在进行插入的时候,两种解决方法: 

①可以把id的值设置为null或者0,这样子mysql都会自己做处理 

②手动指定需要插入的列,不插入这一个字段的数据!

#方法①:
insert into userInfo values(null,'ddf','8979');
insert into userInfo values(0,'ddf','8979');
1
2
3
1
2
3
#方法②:
insert into userInfo(name,password) values('ddf','8979');
1
2

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: