精华内容
下载资源
问答
  • 这篇文章主要介绍了SqlServer Mysql数据库修改自增列的值及相应问题的解决方案的相关资料,需要的朋友可以参考下SQL Server 平台修改自增列值由于之前处理过sql server数据库的迁移工作,尝试过其自增列值的变更,...

    这篇文章主要介绍了SqlServer Mysql数据库修改自增列的值及相应问题的解决方案的相关资料,需要的朋友可以参考下

    SQL Server 平台修改自增列值

    由于之前处理过sql server数据库的迁移工作,尝试过其自增列值的变更,但是通过SQL 语句修改自增列值,是严格不允许的,直接报错(无法更新标识列 '自增列名称‘)。sql server我测试是2008、2012和2014,都不允许变更自增列值,我相信SQL Server 2005+的环境均不允许变更字段列值。

    如果非要在SQL Server 平台修改自增列值的,那就手动需要自增列属性,然后修改该列值,修改成功后再手动添加自增列属性。如果在生成环境修改自增列的话,建议在空闲时间(零点以后,平台或网站使用的用户很少的时间段)来处理这类问题。数据量大且多表关联的,那就通过T-SQL来变更。该方法最大的缺点就是要通过手工辅助取消和添加自增属性的。

    还有一个方法,先将要修改的数据整理为T-SQL的插入脚本,再删除这批要修改的数据,在通过显示插入数据来实现。这种方式适用于要变更不较少的单表记录,该方法到时比较灵活的。

    更简单的方法,那就是如果仅仅若干条,那就让运营人员重新发布信息,删除以前的数据。

    还有网上通过修过T-SQL语句取消自增属性,我在SQL Server 2005+环境测试均未通过,相应的T-SQL代码如下:

    EXEC sys.sp_configure

    @configname = 'allow updates', -- varchar(35)

    @configvalue = 1; -- int

    EXEC sys.sp_configure

    @configname = 'show advanced options' , -- varchar(35)

    @configvalue = 1; -- int

    RECONFIGURE WITH OVERRIDE;

    GO

    UPDATE sys.syscolumns

    SET colstat = 1

    WHERE id = OBJECT_ID(N'PrimaryKeyAndIdentityUpdateTestDataTable', 'U')

    AND name = N'ID'

    AND colstat = 1;

    UPDATE sys.columns

    SET is_identity = 0

    WHERE object_id = OBJECT_ID(N'PrimaryKeyAndIdentityUpdateTestDataTable', 'U')

    AND name = N'ID'

    AND is_identity = 1;

    执行后的结果如下:

    abfa61df28f4eb25f6117786fcef89aa.png

    MySQL 平台修改自增列值

    mysql平台修改自增列值,有些麻烦的。mysql中存在自增列,如果其引擎是myisam,则该列可以为独立主键列,也可以为复合主键列,即该列必须为主键的关联列;如果其引擎是innodb,则该列必须是独立主键列。要直接修改两个自增列值对调变更,肯定是不行的。

    我采用的方法是将两个自增列值(比如1、2)分为以下三个步骤来实现:

    1、先将自增列值为1的修改为0;

    2、再将自增列值为2的修改为1;

    3、再将自增列值为0的修改为2;

    以下两种数据引擎的测试环境均是mysql 5.6。

    数据库引擎为innodb的前提下,具体的mysql测试代码如下:

    drop table if exists identity_datatable;

    create table identity_datatable (

    id int not null AUTO_INCREMENT,

    name varchar(10) not null,

    primary key (id)

    ) engine=innodb,default charset=utf8;

    insert into identity_datatable (id, name)

    values (1, '1'),(2,'2');

    insert into identity_datatable (id, name)

    values (3, '3'),(4,'4');

    select *

    from identity_datatable;

    -- 直接修改不可行

    -- update identity_datatable

    -- set id = case when id = 1 then 2 when id = 2 then 1 end

    -- where id in (1, 2);

    update identity_datatable

    set id = 0

    where id = 1;

    update identity_datatable

    set id = 1

    where id = 2;

    update identity_datatable

    set id = 2

    where id = 0;

    select *

    from identity_datatable;

    未修改前的数据表结果,如下图:

    8fb8db27e324b2182d0d887915b27a2a.png

    修改后的数据表结果,如下图:

    fc5c1e36b1570d6b3c62f7d3a4133549.png

    注意:

    1、采用了两个数字进行交换的方法。

    2、引入的中间值最好<=0的数字。

    3、仅仅提供一种解决方法,也可采用sql server平台的修改方法(1、先取消自增属性后变更最后增加自增属性,2、整理T-SQL脚本重新插入----小数据量时可以;3、运营人员手工重新添加,也是数据量小的情况下)。

    数据库引擎为myisam的前提下,具体的mysql测试代码如下:

    drop table if exists autoincremenet_datatable_myisam;

    create table autoincremenet_datatable_myisam (

    tid int not null,

    id int not null auto_increment,

    name varchar(20) not null,

    primary key(id)

    ) engine = myisam, default charset = utf8;

    insert into autoincremenet_datatable_myisam (tid, id, name)

    values(1,1,'a'),(2,2,'b'),(3,3,'c'),(4,4,'d');

    select *

    from autoincremenet_datatable_myisam;

    update autoincremenet_datatable_myisam

    set id = 0;

    where id = 1;

    select *

    from autoincremenet_datatable_myisam;

    update autoincremenet_datatable_myisam

    set id = 1;

    where id = 2;

    select *

    from autoincremenet_datatable_myisam;

    update autoincremenet_datatable_myisam

    set id = 2;

    where id = 0;

    select *

    from autoincremenet_datatable_myisam;

    注意:

    1、以上测试中的变更不可行。

    2、疑问“第一条update和其后面的select确实看到了修改后的值,但是随后的sql继续执行,均报错却又恢复了未修改之前的状态“,这个还不清楚,需要继续研究。

    Oracle平台的没有接触,不晓得,熟悉oracle平台的博友针对其自增列的变更做个测试或给出个总结。

    展开全文
  • http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html方法1:truncate table 你的表名//这样不但将数据全部删除,而且重新定位自增的字段方法2:delete from 你的表名dbcc checkident(你的表名,reseed,0)//重新...

    http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html

    方法1:

    truncate table 你的表名

    //这样不但将数据全部删除,而且重新定位自增的字段

    方法2:

    delete from 你的表名

    dbcc checkident(你的表名,reseed,0)

    //重新定位自增的字段,让它从1开始

    方法3:

    如果你要保存你的数据,介绍你第三种方法,by QINYI

    用phpmyadmin导出数据库,你在里面会有发现哦

    编辑sql文件,将其中的自增下一个id号改好,再导入。

    -------------------------

    truncate命令是会把自增的字段还原为从1开始的,或者你试试把table_a清空,然后取消自增,保存,再加回自增,这也是自增段还原为1的方法。

    -------------------------

    MySql数据库唯一编号字段(自动编号字段)

    在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性

    来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据

    列自增属性。

    ISAM表

    如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开

    始,并1为基数递增。

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

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

    当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果

    插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况

    二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递

    增。也就是说,可以跳过一些编号。

    如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。

    如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号

    从该值开始递增。

    如果用replace命令基于AUTO_INCREMENT数据列里的值来修改数据表里的现有记录,即AUTO_INCREMENT数

    据列出现在了replace命令的where子句里,相应的AUTO_INCREMENT值将不会发生变化。但如果replace命

    令是通过其它的PRIMARY KEY OR UNIQUE索引来修改现有记录的(即AUTO_INCREMENT数据列没有出现在

    replace命令的where子句中),相应的AUTO_INCREMENT值--如果设置其为NULL(如没有对它赋值)的话--就

    会发生变化。

    last_insert_id()函数可获得自增列自动生成的最后一个编号。但该函数只与服务器的本次会话过程中

    生成的值有关。如果在与服务器的本次会话中尚未生成AUTO_INCREMENT值,则该函数返回0。

    其它数据表的自动编号机制都以ISAM表中的机制为基础。

    MyISAM数据表

    删除最大编号的记录后,该编号不可重用。

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

    可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。

    可使用复合索引在同一个数据表里创建多个相互独立的自增序列,具体做法是这样的:为数据表创建一个由多个数据列组成的PRIMARY KEY OR UNIQUE索引,并把AUTO_INCREMENT数据列包括在这个索引里作为它的最后一个数据列。这样,这个复合索引里,前面的那些数据列每构成一种独一无二的组合,最末尾的AUTO_INCREMENT数据列就会生成一个与该组合相对应的序列编号。

    HEAP数据表

    HEAP数据表从MySQL4.1开始才允许使用自增列。

    自增值可通过CREATE TABLE语句的 AUTO_INCREMENT=n选项来设置。

    可通过ALTER TABLE语句的AUTO_INCREMENT=n选项来修改自增始初值。

    编号不可重用。

    HEAP数据表不支持在一个数据表中使用复合索引来生成多个互不干扰的序列编号。

    BDB数据表

    不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。

    可重用编号。

    支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

    InnDB数据表

    不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。

    不可重用编号。

    不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

    在使用AUTO_INCREMENT时,应注意以下几点:

    AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。

    设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍。

    AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。

    AUTO_INCREMENT数据列必须具备NOT NULL属性。

    AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。

    当进行全表删除时,AUTO_INCREMENT会从1重新开始编号。全表删除的意思是发出以下两条语句时:

    delete from table_name;

    or

    truncate table table_name

    这是因为进行全表操作时,MySQL实际是做了这样的优化操作:先把数据表里的所有数据和索引删除,然后重建数据表。如果想删除所有的数据行又想保留序列编号信息,可这样用一个带where的delete命令以

    抑制MySQL的优化:

    delete from table_name where 1;

    这将迫使MySQL为每个删除的数据行都做一次条件表达式的求值操作。

    强制MySQL不复用已经使用过的序列值的方法是:另外创建一个专门用来生成AUTO_INCREMENT序列的数据表,并做到永远不去删除该表的记录。当需要在主数据表里插入一条记录时,先在那个专门生成序号的

    表中插入一个NULL值以产生一个编号,然后,在往主数据表里插入数据时,利用LAST_INSERT_ID()函数取得这个编号,并把它赋值给主表的存放序列的数据列。如:

    insert into id set id = NULL;

    insert into main set main_id = LAST_INSERT_ID();

    可用alter命令给一个数据表增加一个具有AUTO_INCREMENT属性的数据列。MySQL会自动生成所有的编号。

    要重新排列现有的序列编号,最简单的方法是先删除该列,再重建该,MySQL会重新生连续的编号序列。

    在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数的LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,

    则第二次函数调用返回的就是expr的值。下面演示该方法的具体操作:

    先创建一个只有一个数据行的数据表:

    create table seq_table (id int unsigned not null);

    insert into seq_table values (0);

    接着用以下操作检索出序列号:

    update seq_table set seq = LAST_INSERT_ID( seq + 1 );

    select LAST_INSERT_ID();

    通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。

    该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不

    会影响其它客户程序的正常表操作。

    alter table table_name auto_increment=n;

    注意n只能大于已有的auto_increment的整数值,小于的值无效.

    show table status like 'table_name' 可以看到auto_increment这一列是表现有的值.步进值没法改变.只能通过下面提到last_inset_id()函数变通使用

    在使用AUTO_INCREMENT时,应注意以下几点:

    AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序

    列的编号个可增加一倍。

    AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。

    AUTO_INCREMENT数据列必须具备NOT NULL属性。

    AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。

    在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数

    的LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,则第二次函数调用返回的就是expr的值。下面演示该方法的具体操作:

    先创建一个只有一个数据行的数据表:

    create table seq_table (id int unsigned not null);

    insert into seq_table values (0);

    接着用以下操作检索出序列号:

    update seq_table set seq = LAST_INSERT_ID( seq + 1 );

    select LAST_INSERT_ID();

    通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。

    该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不

    会影响其它客户程序的正常表操作。

    有两点需要加强注意:

    1、只有一列的时候是不行的!

    2、自动编号必须作为主键才有效!

    展开全文
  • 在DM 数据库中,自增有两种方法实现,一种是自增列,另一种通过序列实现。1 自增列1.1 创建自增列在创建表时可以制定是否自增。 一个表只能有一个自增列。https://www.cndba.cn/dave/article/3590语法格式1.种子...

    在DM 数据库中,自增有两种方法实现,一种是自增列,另一种通过序列实现。

    1 自增列

    1.1 创建自增列

    在创建表时可以制定列是否自增。 一个表只能有一个自增列。

    https://www.cndba.cn/dave/article/3590

    语法格式

    1.种子:装载到表中的第一个行所使用的值;

    2.增量:增量值,该值被添加到前一个已装载的行的标识值上。增量值可以为正数或负数,但不能为 0。

    使用说明

    https://www.cndba.cn/dave/article/3590

    1.IDENTITY 适用于 int(-2147483648~+2147483647)、bigint(-2^63~+2^63-2)类型的列;每个表只能创建一个自增列;

    2.不能对自增列使用 DEFAULT 约束;

    3.必须同时指定种子和增量值,或者二者都不指定。如果二者都未指定,则取默认值(1,1);若种子或增量为小数类型,报错;

    4.最大值和最小值为该列的数据类型的边界;

    5.建表种子和增量大于最大值或者种子和增量小于最小值时报错;

    6.自增列一旦生成,无法更新,不允许用 Update 语句进行修改;

    临时表、列存储表、水平分区表、垂直分区表不支持使用自增列。

    SQL> create table HuaiNing(id int identity,name varchar(20));

    executed successfully

    used time: 6.902(ms). Execute id is 551.

    SQL>

    SQL> desc huaining

    LINEID NAME TYPE$ NULLABLE

    ---------- ---- ----------- --------

    1 ID INTEGER N

    2 NAME VARCHAR(20) Y

    used time: 12.016(ms). Execute id is 552.

    SQL>

    1.2 自增列查询函数

    1)IDENT_SEED (‘tablename’) : 返回种子值,该值是在带有自增列的表中创建自增列时指定的。

    SQL> select ident_seed('CNDBA.HUAINING');

    LINEID IDENT_SEED('CNDBA.HUAINING')

    ---------- ----------------------------

    1 1

    used time: 2.280(ms). Execute id is 553.

    SQL>

    2)IDENT_INCR (‘tablename’):返回增量值,该值是在带有自增列的表中创建自增列时指定的。https://www.cndba.cn/dave/article/3590

    SQL> select ident_incr('CNDBA.HUAINING');

    LINEID IDENT_INCR('CNDBA.HUAINING')

    ---------- ----------------------------

    1 1

    used time: 2.114(ms). Execute id is 555.

    SQL>

    3)SET IDENTITY_INSERT 属性: 设置是否允许将显式值插入表的自增列中。

    语法格式:

    https://www.cndba.cn/dave/article/3590

    SET IDENTITY_INSERT [.] ON | OFF;

    使用说明

    1.IDENTITY_INSERT 属性的默认值为 OFF。SET IDENTITY_INSERT 的设置是在执行或运行时进行的。当一个连接结束,IDENTITY_INSERT 属性将被自动还原为 OFF;

    2.DM 要求一个会话连接中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON,当设置一个新的表 IDENTITY_INSERT 属性设置为 ON 时,之前已经设置为 ON 的表会自动还原为 OFF。当一个表的 IDENTITY_INSERT 属性被设置为 ON 时,该表中的自动增量列的值由用户指定。如果插入值大于表的当前标识值(自增列当前值),则 DM 自动将新插入值作为当前标识值使用,即改变该表的自增列当前值;否则,将不影响该自增列当前值;

    3.当设置一个表的 IDENTITY_INSERT 属性为 OFF 时,新插入行中自增列的当前值由系统自动生成,用户将无法指定;

    4.自增列一经插入,无法修改;

    5.手动插入自增列,除了将 IDENTITY_INSERT 设置为 ON,还要求在插入列表中明确指定待插入的自增列列名。插入方式与非 IDENTITY 表是完全一样的。如果插入时,既不指定自增列名也不给自增列赋值,则新插入行中自增列的当前值由系统自动生成。

    #插入时没有制定id的值:

    SQL> insert into huaining values('dave');

    affect rows 1

    used time: 2.114(ms). Execute id is 557.

    SQL> insert into huaining values('cndba');

    affect rows 1

    SQL> select * from huaining;

    LINEID ID NAME

    ---------- ----------- -----

    1 1 dave

    2 2 cndba

    used time: 1.177(ms). Execute id is 562.

    SQL>

    #将 IDENTITY_INSERT 设置为 ON,然后显示的指定id的值:

    SQL> set identity_insert cndba.huaining on;

    executed successfully

    used time: 1.226(ms). Execute id is 568.

    #注意这里,简写不行:

    SQL> insert into huaining values(4,'hefei');

    insert into huaining values(4,'hefei');

    [-2723]:Error in line: 1

    Only if specified in the column list and SET IDENTITY_INSERT is ON, then identity column could be assigned value.

    used time: 0.862(ms). Execute id is 0.

    SQL> insert into huaining(id,name) values(4,'hefei');

    affect rows 1

    used time: 1.846(ms). Execute id is 569.

    SQL> commit;

    executed successfully

    used time: 10.203(ms). Execute id is 570.

    SQL> select * from huaining;

    LINEID ID NAME

    ---------- ----------- -----

    1 1 dave

    2 2 cndba

    3 4 hefei

    used time: 0.643(ms). Execute id is 571.

    SQL>

    4) 不允许用户修改自增列的值。

    SQL> update huaining set id=3 where name='hefei';

    update huaining set id=3 where name='hefei';

    [-2664]:Error in line: 1

    Try to alter identity column [ID].

    used time: 1.558(ms). Execute id is 0.

    SQL>

    5) 还原 IDENTITY_INSERT 属性。

    SQL> set identity_insert cndba.huaining off;

    executed successfully

    used time: 1.489(ms). Execute id is 572.

    6) 插入后再次查询。

    SQL> insert into huaining values('anqing');

    affect rows 1

    used time: 2.026(ms). Execute id is 573.

    SQL> commit;

    executed successfully

    used time: 10.943(ms). Execute id is 574.

    #注意这里的id值是从5开始的:

    SQL> select * from huaining;

    LINEID ID NAME

    ---------- ----------- ------

    1 1 dave

    2 2 cndba

    3 4 hefei

    4 5 anqing

    used time: 1.757(ms). Execute id is 575.

    SQL>

    2 序列

    序列是一个数据库实体,通过它多个用户可以产生唯一整数值,可以用序列来自动地生成主关键字值。https://www.cndba.cn/dave/article/3590

    2.1 创建序列

    语法格式:

    CREATE SEQUENCE [ .] [ ];

    ::= {}

    ::=

    INCREMENT BY |

    START WITH |

    MAXVALUE |

    NOMAXVALUE|

    MINVALUE |

    NOMINVALUE|

    CYCLE|

    NOCYCLE|

    CACHE |

    NOCACHE|

    ORDER |

    NOORDER |

    GLOBAL |

    LOCAL

    指明被创建的序列属于哪个模式,缺省为当前模式;

    指明被创建的序列的名称,序列名称最大长度128字节;

    指定序列数之间的间隔,这个值可以是[-1000000, 1000000]之间任意的DM正整数或负整数,但不能为0。如果此值为负,序列是下降的,如果此值为正,序列是上升的。如果忽略INCREMENT BY子句,则间隔缺省为1。增量值的绝对值必须小于( - );

    指定被生成的第一个序列数,可以用这个选项来从比最小值大的一个值开始升序序列或比最大值小的一个值开始降序序列。对于升序序列,缺省值为序列的最小值,对于降序序列,缺省值为序列的最大值;

    指定序列能生成的最大值,如果忽略MAXVALUE子句,则降序序列的最大值缺省为 -1 ,升序序列的最大值 缺 省 为9223372036854775807(0x7FFFFFFFFFFFFFFF),若指定的最大值超出缺省最大值,则DM自动将最大值置为缺省最大值。非循环序列在到达最大值之后,将不能继续生成序列数;

    指定序列能生成的最小值,如果忽略MINVALUE子句,则升序序列的最小值缺省为 1 ,降序序列的最小值 缺 省 为 -9223372036854775808(0x8000000000000000),若指定的最小值超出缺省最小值,则DM自动将最小值置为缺省最小值。循环序列在到达最小值之后,将不能继续生成序列数。最小值必须小于最大值;

    CYCLE 该关键字指定序列为循环序列:当序列的值达到最大值/最小值时,序列将从最小值/最大值计数;

    NOCYCLE 该关键字指定序列为非循环序列:当序列的值达到最大值/最小值时,序列将不再产生新值;

    CACHE 该关键字表示序列的值是预先分配,并保持在内存中,以便更快地访问;指定预先分配的值的个数,最小值为2;最大值为50000;且缓存值不能大于( - )/;

    NOCACHE 该关键字表示序列的值是不预先分配;

    ORDER 该关键字表示以保证请求顺序生成序列号;

    NOORDER 该关键字表示不保证请求顺序生成序列号;

    GLOBAL 该关键字表示MPP环境下序列为全局序列,缺省为GLOBAL;

    LOCAL 改关键字表示MPP环境下序列为本地序列。

    创建序列:

    SQL> create table anqing(id int);

    executed successfully

    used time: 5.814(ms). Execute id is 576.

    SQL> create sequence seq_id increment by 10;

    executed successfully

    used time: 4.758(ms). Execute id is 577.

    SQL>

    #插入序列值:

    SQL> create sequence seq_id increment by 10;

    executed successfully

    used time: 4.758(ms). Execute id is 577.

    SQL> insert into anqing(seq_id.nextval);

    insert into anqing(seq_id.nextval);

    insert into anqing(seq_id.nextval);

    *

    line 1, column 34, nearby [;] has error[-2007]:

    Syntax error.

    used time: 1.101(ms). Execute id is 0.

    SQL>

    SQL> insert into anqing(id) values(seq_id.nextval);

    affect rows 1

    used time: 2.996(ms). Execute id is 578.

    SQL> select * from anqing;

    LINEID ID

    ---------- -----------

    1 1

    used time: 2.227(ms). Execute id is 579.

    SQL>

    2.2 序列修改语句

    DM 系统提供序列修改语句,包括修改序列步长值、设置序列最大值和最小值、改变序列的缓存值、循环属性、ORDER 属性。

    语法格式

    https://www.cndba.cn/dave/article/3590

    ALTER SEQUENCE [ .] [ ];

    ::= {}

    ::=

    INCREMENT BY |

    MAXVALUE |

    NOMAXVALUE|

    MINVALUE |

    NOMINVALUE|

    CYCLE|

    NOCYCLE|

    CACHE |

    NOCACHE|

    ORDER|

    NOORDERhttps://www.cndba.cn/dave/article/3590

    #创建完序列后直接修改序列的步长。

    SQL> CREATE SEQUENCE SEQ1 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE CACHE 10;

    executed successfully

    used time: 7.370(ms). Execute id is 580.

    SQL> ALTER SEQUENCE SEQ1 INCREMENT BY 1 ;

    executed successfully

    used time: 13.188(ms). Execute id is 581.

    SQL> SELECT SEQ1.NEXTVAL FROM DUAL;

    LINEID NEXTVAL

    ---------- --------------------

    1 -994

    used time: 1.474(ms). Execute id is 582.

    SQL>

    #创建序列后使用NEXTVAL访问了序列,然后修改步长。

    SQL> CREATE SEQUENCE SEQ2 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE NOCACHE ;

    executed successfully

    used time: 10.377(ms). Execute id is 583.

    SQL> SELECT SEQ2.NEXTVAL FROM DUAL;

    LINEID NEXTVAL

    ---------- --------------------

    1 5

    used time: 1.350(ms). Execute id is 584.

    SQL> ALTER SEQUENCE SEQ2 INCREMENT BY 1 ;

    executed successfully

    used time: 5.307(ms). Execute id is 585.

    SQL> SELECT SEQ2.NEXTVAL FROM DUAL;

    LINEID NEXTVAL

    ---------- --------------------

    1 6

    used time: 2.130(ms). Execute id is 586.

    SQL>

    #例3 修改序列的最小值。

    SQL> CREATE SEQUENCE SEQ3 INCREMENT BY 1 START WITH 100 MINVALUE 3 ;

    executed successfully

    used time: 4.964(ms). Execute id is 587.

    SQL> ALTER SEQUENCE SEQ3 MINVALUE 2;

    executed successfully

    used time: 5.278(ms). Execute id is 588.

    SQL>

    2.3 序列删除语句

    DM 系统允许用户在建立序列后还可随时删除序列。

    语法格式:

    DROP SEQUENCE [ .];

    SQL> drop sequence seq3;

    executed successfully

    used time: 14.809(ms). Execute id is 589.

    SQL>

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    展开全文
  • Oracle数据库主键自增

    2020-12-23 06:52:40
    Oracle数据库主键自增在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增。下面我就为大家介绍两种实现主键自增的...

    Oracle数据库主键自增

    在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增。下面我就为大家介绍两种实现主键自增的方法。

    两种方法的基础都有一个概念就是序列(sequence)的概念,一种是利用序列和显式调用的方式去实现主键自增,另一种是通过序列和触发器(trigger)来实现主键自增。

    /*1.利用序列主键自增*/

    第一步、创建表

    --创建表,主键为ID

    CREATE TABLE YFF (

    ID INT primary key ,

    NAME VARCHAR2(10)

    );

    --创建表的格式

    CREATE TABLE 表名(

    字段名 字段类型(可以加一些约束,例如主键约束),

    字段名 字段类型

    )

    第二步、创建序列

    --创建序列

    create sequence seq_yff

    start with 1

    increment by 1;

    --创建序列的格式

    create sequence 序列名称

    start with 开始数字

    increment by 增长数字

    minvalue 最小值

    maxvalue 最大值

    cycle 是否循环(cycle为循环,nocycle为不循环)

    nocache  不使用缓存

    关于序列的其他重要操作

    --查询序列(利用nextval查询序列下一次的值)

    select seq_yff.nextval from dual;

    --查询序列的格式

    Select 序列名.nextval from dual

    (dual为伪表,当我们不需要从具体的表来取得表中数据,而是单纯地

    得到一些我们想得到的信息,就可以使用伪表)

    注意:这里第一次执行这条查询语句得到结果为1,再执行得到2,第一种实现主键自增的方法就是使用序列名.nextval使得值一直增加的

    --删除序列()

    DROP SEQUENCE seq_yff;

    注意:序列和表不是连接在一起的,当序列创建之后,用在这个表之后,我将该表删除,但是序列的值还是停留在之前的值上,所以需要注意这个问题

    第三步、利用序列+显式化调用 进行自增

    insert into YFF values (seq_yff.nextval,'张三');

    insert into YFF values (seq_yff.nextval,'张三');

    select * from YFF;

    --2利用序列+触发器调用 进行主键自增

    此处已经表和序列都用第一种方法中使用过的

    第一步、在表和序列创建好之后,创建触发器

    --创建触发器

    create or replace trigger tri_yff_insert

    before insert on YFF

    referencing old as old new as new

    for each row

    begin

    select seq_yff.nextval

    into :new.ID

    from dual;

    end tri_yff_insert;

    --创建触发器格式

    create [or replace] tigger 触发器名

    触发时间 触发事件

    on 表名

    [for each row]

    begin

    pl/sql语句

    end

    --解释上面的触发器语句

    create or replace trigger tri_yff_insert    创建触发器并命名

    before insert on YFF              触发时间为向表YFF中插入时

    referencing old as old new as new

    for each row      对表的每一行触发一次,否则只对整表执行一次

    begin

    select seq_yff.nextval

    into :new.ID

    from dual;

    end tri_yff_insert;

    其他对触发器的操作

    --查询表中触发器

    select * from all_triggers WHERE table_name='YFF'

    --删除触发器

    drop trigger tri_yff_insert;

    第二步、插入数据

    insert into  YFF (ID,Name) values(100,'李四');

    insert into  YFF (Name) values('李四');

    --不管给不给主键赋值,这里触发器都会使得主键值为序列的值

    展开全文
  • 解决数据库id自增问题 alter table 表名 AUTO_INCREMENT=n; n是设置新的数据从第n个开始自增 注意:删除原表数据后,在查询里运行此语句才有效
  • MySQL数据库删除数据后自增ID不连续引发的两种情况的解决方法
  • MySQL--自增列学习

    2021-01-19 13:49:33
    ##=====================================================================================##在数据库表设计中会纠结于”自然键”和”代理键”的选择,自然键在实现数据“软删除”时实现比较复杂,部分自然键因为...
  • mysql数据库自增id用法大全

    千次阅读 2021-01-18 21:59:30
    在mysql数据库中,使用auto_increment 字段来辅助为自增列赋值。显示有关msyql自增ID的相关配置信息:复制代码 代码示例:SHOW VARIABLES LIKE 'auto_incre%';输出:auto_increment_increment 1auto_increment_offset...
  • DM7 达梦数据库 序列 和 自增列 说明

    千次阅读 2020-12-18 23:37:05
    在DM 数据库中,自增有两种方法实现,一种是自增列,另一种通过序列实现。1 自增列1.1 创建自增列在创建表时可以制定是否自增。 一个表只能有一个自增列。语法格式...
  • Mysql数据库添加主键删除数据数据依然排序显示 提示:平常操作数据库时,我们对主键是不需要进行这个操作的,但是测试数据时,有时就是需要这样的操作也是存在的: tips: 文章较长,关键操作:删除操作,...
  • 2、使用truncate命令把原数据表中的数据清空,表和索引所占用的空间会恢复到初始大小 truncate table tableName; 3、在原数据表插入临时表的内容 INSERT tableName (xx,xxx,xxx) SELECT xx,xxx,xxxx FROM ...
  • Oracle数据库自增列

    2021-08-07 23:55:52
    –查询插入的数据 select * from Student –创建自增序列 CREATE SEQUENCE S_LOG_INFO_PRIMARYKEY_SEQUENCE MINVALUE 1 --最小值 NOMAXVALUE --不设置最大值 START WITH 1 --从1开始计数 INCREMENT BY 1 --每次加1 ...
  • 方法一: truncate table 你的表名 这样不但将数据全部删除,而且重新定位自增的字段 truncate命令是会把自增的字段还原为从1开始的,或者...在mysql中删除数据后,添加数据,id值依然从删除的位置开始增加 alt...
  • SQL Server 2008 数据库主键自增插入显示值 前几天在工作的时候遇到在删除数据库中表的数据的时候,删除之后,重新添加的数据没有得到原来的数据的id值(表中id为主键,且设置为自增) ,使用的是SQL Server 2008 ,...
  • 在mysql数据库中,当数据表的主键值设置为自增时,在使用过程中如果删除了最新的一条或多条记录,新增记录的主键值没有像我们想象的那样紧接着已有的值自增,而是紧接着删除前的最大id值自增.这样就导致主键的值看起来...
  • 2017年11月9日MySQL序列使用MySQL序列是一组整数:1,2,3,...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的的序列。...
  • Mysql数据库因为其有自动+1,故一般我们不需要花费太多时间,直接用关键字auto_increment即可,但是Oracle不行,它没有自动增长机制。顾我们需要自己去实现。一般有两种方式,但是这两种方式都与序列化有关。第一种...
  • mysql数据库自增id,删除数据后id不连续,出现断层 当删除前几条数据,数据库重启与不重启,自增的id会延续最大的id然后继续走下去,会出现断层; 当删除中间几条数据,数据库重启与不重启,自增的id会延续最大的id...
  • (2)依赖数据库自增机制达到全局ID唯一使用如下语句:REPLACE INTO Tickets64 (stub) VALUES ('a');SELECT LAST_INSERT_ID();这样可以保证全局ID唯一,但这个Tickets64表依旧是个单点。(3)依赖数据库自增机制达到全局...
  • truncate table table_name;
  • 自增列持久化问题5.5/5.6/5.7三个版本中,MySQL并不会将自增列分配的自增值信息固化到磁盘,当MySQL重启,会根据自增列上当前最大值和参数auto_increment_offset来确定下一次的自增值,为快速获取自增列上最大值,...
  • mysql数据库使用auto_increment 字段来辅助为自增列赋值。SHOW VARIABLES LIKE 'auto_incre%';输出auto_increment_increment 1auto_increment_offset 1auto_increment_increment= 1 ,每次插入数据,id++;auto_...
  • 首先需要默认设置为 ,也就是自增的标识 nextval(‘wx_request_log_id_seq’::regclass) 其次如果你想要新增语句操作的时候,返回相关ID主键做其他操作,你需要进行帖注解 (我使用的是tk-mybatis...PS : 数据库中的自增
  • 问题:数据库自增的主键不连续,SQL的自增挺好用,只是开发过程中一旦删除数据,标识就不连续了,写起来,也很郁闷。Mysql当清空一个表的时候,重新插入数据,发现auto_increment属性的字段计数不是从1开始的时候...
  • 原因是因为主键是唯一的,绝对不能出现重复,只要曾经出现过,哪怕删掉了也不能用,这是数据库设计问题。 解决之道: 其实就是把自增约束先消除再添加,就好了。 然后保存 接下来再把自增选项选上 之后再添加新的...
  • 可以看到,我把中间数据 id =3 删除后,在中间形成了id断层 这时候用第一种方法是行不通的 解决:先删除id这个字段,再把id这个字段按建表时的要求添加到首位 alter table students drop id; al

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,825
精华内容 33,530
关键字:

数据库使用自增列后删除数据