sql数据库主键自增长设置

作者:袖梨 2022-06-29

本文章来给大家总结现在常用的数据库主键自增长的设置方法,这里包括了:SQLServer、Oracle、MySQL 三种数据库了,有需要的朋友可进入参考。

主键自增长

MySQL的主键自增长只需将主键定义为AUTO_INCREMENT,如:

 代码如下 复制代码

CREATE TABLE user
(
 id int AUTO_INCREMENT,
 name varchar(30) NOT NULL,
 password varchar(30) NOT NULL,
 PRIMARY KEY (id)
)
INSERT INTO user(name,password) VALUES('sunyzc','123');


SQLServer的主键自增长也很简单,只需将主键定义为IDENTITY,如:

1.新建一数据表,里面有字段id,将id设为为主键

 代码如下 复制代码

create table tb(id int,constraint pkid primary key (id))
create table tb(id int primary key )

2.新建一数据表,里面有字段id,将id设为主键且自动编号

 代码如下 复制代码

create table tb(id int identity(1,1),constraint pkid primary key (id))
create table tb(id int identity(1,1) primary key )

3.已经建好一数据表,里面有字段id,将id设为主键

 代码如下 复制代码

alter table tb alter column id int not null
alter table tb add constraint pkid primary key (id)

4.删除主键

 代码如下 复制代码
Declare @Pk varChar(100);
Select @Pk=Name from sysobjects where Parent_Obj=OBJECT_ID('tb') and xtype='PK';
if @Pk is not null
exec('Alter table tb Drop '+ @Pk)

 

Oracle的主键自增长需要通过自定义的 SEQUENCE:

先创建用户表 user:

 代码如下 复制代码

CREATE TABLE user
(
 id int PRIMARY KEY,
 name varchar(30) NOT NULL,
 password varchar(30) NOT NULL
)


创建SEUQENCE:

 代码如下 复制代码

CREATE SEQUENCE seq_user INCREMENT BY 1 START WITH 1 

NOMAXVALUE NOCYCLE NOCACHE;

以上 sql 语句完成了一个序列(SEQUENCE)的建立过程,名称为seq_user,范围是从1开始到无限大(无限大的程度是由你机器决定的),

INCREMENT BY 1,seq每次加1;
START WITH 1,seq从1开始计数;
NOMAXVALUE,seq不设置最大值;
NOCYCLE,seq一直增加,不循环;如果你设置了最大值那么你可以用CYCLE,会使seq到最大之后循环;
NOCACHE,不建缓冲区,如果你给出了CACHE值(如CACHE 10)那么系统将自动读取你的CACHE值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如宕机了或Oracle死了,则下次取出的seq值将和上次的不连贯。

要在 user 表中插入新记录,必须使用 nextval 函数(该函数从 seq_user 序列中取回下一个值),我这可以这样插入数据:

 代码如下 复制代码

INSERT INTO user(id,name,password) VALUES(seq_user.nextval,'sunyzc','123');

上面的 sql 会在 user 表中插入一条新记录。id 的赋值是来自 seq_user 序列的下一个数字。

 

也可以通过创建 TRIGGER 来实现插入时主键自增长:

 代码如下 复制代码

CREATE TRIGGER 触发器名称 BEFORE
 INSERT ON 表名 FOR EACH ROW WHEN (new.表的自增长id is null)
BEGIN
 SELECT 序列名.nextval into: new.表的自增长id from dual;
END;


然后这样直接插入数据:

 代码如下 复制代码

 INSERT INTO user(name,password) VALUES('sunyzc','123');

查看用户的所有序列(必须以管理员身份登录且用户名大写)

 代码如下 复制代码

 select * from dba_sequences where sequence_owner='用户名';

相关文章

精彩推荐