Oracle中并没有主键自增,但可以设置触发器; mysql 没有sequence, 但可以使用函数。
1、自增主键
每个表最多只能有一个标识列
自增值修改、唯一键冲突和事务回滚都会导致自增主键id不连续的情况 ,详见MySQL自增主键详解
插入sql:insert into sys_users(user_name,user_pwd,sex) values(‘shaoduo’,’shao111’,’男’)
也可以 insert into sys_users(user_id,user_name,user_pwd,sex)values(T_SYS_USER_SEQ.NEXTVAL,'shaoduo','shao111','男') ;commit;
db2:自增主键: GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1 )
1 )修改为自动增长:Alter table
2)当修改表中一列自动增长的开始值时,可用下面的命令: ALTER TABLE ALTER COLUMN RESTART WITH 18;
CREATE TABLE
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1 )
PRIMARY KEY (ID)
)
Mysql:AUTO_INCREMENT
1)修改表时设置主键自增长
alter table t1 change column id id int not null primary key auto_increment;
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
2) 修改表时删除主键自增长:ALTER TABLE stu CHANGE sid sid INT;
3)创建表时设置主键自增长(主键必须是整型才可以自增长):CREATE TABLE stu(sid INT PRIMARY KEY AUTO_INCREMENT);
Oracle:Oracle中并没有主键自增,但是可以设置触发器
触发器方式也需要创建SEQUENCE ,然后在将SEQUENCE 设置触发。
1.创建SEQ:SEQUENCE T_SYS_USER_SEQ (具体参见oracle -序列)
2.设置触发器
执行下边语句
----创建触发器
create or replace trigger T_SYS_USER_USER_ID_TRIGGER
before insert on SYS_USERS
for each row
begin
select T_SYS_USER_SEQ.nextval into :new.user_id from dual;
end T_SYS_USER_USER_ID_TRIGGER;
注意一下这四条信息改成自己的就行了
T_SYS_USER_USER_ID_TRIGGER 是设置的触发器名字
SYS_USERS是表名
T_SYS_USER_SEQ 是序列名
new.user_id 是 new.主键
(最全写法) 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;
3.插入的SQL
忽略id 直接插入, id数据库自动添加
2、SEQUENCE
插入sql:
insert into sys_users(user_id,user_name,user_pwd,sex)values(T_SYS_USER_SEQ.NEXTVAL,'shaoduo','shao111','男') ;commit;
db2:NEXT VALUE FOR orders_seq ----序列生成的下一个值
PREVIOUS VALUE FOR orders_seq ----序列生成的前一个值:前一个SQL语句中为序列生成的数值
支持非 SQL 标准语法 NEXTVAL 代替 NEXT VALUE ,以及PREVVAL代替 PREVIOUS VALUE
Mysql:没有sequence
一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长、开始索引、是否循环等,最重要的是一张表只能由一个字段使用自增,但有的时候我们需要两个或两个以上的字段实现自增(单表多字段自增),MySQL本身是实现不了的,但我们可以用创建一个序列表,使用函数来获取序列的值。
Oracle:
3、区别identity只能在一个表中使用,多个表不可以共享identity;而sequence可以通过命名方式在同一个数据库内部的多个表中共享序列号发生器。
虽然标识和序列都用于生成数值,但您也许要根据特殊情况选择使用一种来代替另一种。
在以下情况下,标识列很有用:
表中只有一列需要自动生成的值;
每一行都需要独立的值用自动生成器来产生表的主键;
生成新值的进程与对表的插入操作紧密联系,无论插入操作是如何发生的。
在以下情况下序列对象很有用:
要将从一个序列生成的值存储到多个表中;
每个表有多个列需要自动生成的值(可能通过使用同一个序列或多个序列为每一行生成多个值);
生成新值的进程与任何对表的引用无关。
与序列对象不同,标识列是在表上定义的,因此需要某些限制。每个表最多只能有一个标识列。当创建一个列作为标识列时,对于该列必须使用确切的数字数据类型。因为标识属性为列生成一个值,这类似于DEFAULT子句所做的,所以在定义标识列时不能指定 DEFAULT 子句。标识列被隐式地定义成 NOT NULL 。
4、带年月日的主键生成
考虑多应用服务器、多线程,详见 citic流水号生产代码