1、首先打开SQL Server Management管理工具,使用sql语句创建一张测试表。
2、在测试表中,插入3条测试数据。
3、使用一条语句批量修改整个表的数据。
4、使用一条语句批量修改指定条数的记录。
5、使用一条语句批量修改这三条数据(按条件修改值)。
6、使用一条语句批量修改数据,使用where和case when。
流水号格式:P + 年四位月两位流水号三位
例如:
P20130203001
P20130203999
CREATE TABLE TEST_SEQNO (
SEQNO VARCHAR(10) PRIMARY KEY,
VALVARCHAR(20)
)
方案一:使用 序列号 + 触发器 + 存储过程 + 数据库作业
-- 序列号
CREATE SEQUENCE seq_testno
increment by 1-- 每次递增1
start with 1 -- 从1开始
nomaxvalue -- 没有最大值
minvalue 1 -- 最小值=1
NOCYCLE
-- 触发器.
CREATE OR REPLACE TRIGGER tr_test_seqno
BEFORE INSERT ON TEST_SEQNO
FOR EACH ROW
BEGIN
SELECT
'P' || TO_CHAR(sysdate, 'YYYYMM') || TRIM(TO_CHAR(seq_testno.nextval, '000')) INTO :new.SEQNO
FROM
dual
END
/
-- 测试
SQL>INSERT INTO TEST_SEQNO(VAL) VALUES('T1.1')
已创建 1 行。
SQL>SELECT * FROM TEST_SEQNO
SEQNOVAL
-------------------- ----------------------------------------
P201302001 T1.1
-- 用于 重置序列号的 存储过程.
CREATE OR REPLACE PROCEDURE ResetSeqTestno
-- 注:由于动态SQL 里面,创建序列号,
-- 如果不加下面这行,执行将报错 “ORA-01031: 权限不足”
AUTHID CURRENT_USER
AS
BEGIN
-- 由于每月1日早上 0点, 需要把序列号的当前数值, 重置为 1.
-- 但是由于不能通过 ALTER SEQUENCE 语句来修改序列号的当前值
-- 因此只能每月1日 删除-重建 序列号.
-- 首先是删除.
EXECUTE IMMEDIATE('DROP SEQUENCE seq_testno ')
-- 然后是重建.
EXECUTE IMMEDIATE('CREATE SEQUENCE seq_testno increment by 1 start with 1')
END
/
-- 将存储过程, 加入 Oracle 作业. 每月1日 00:00 执行.
variable jobno number
begin
dbms_job.submit(:jobno, 'ResetSeqTestno', ADD_MONTHS(trunc(sysdate, 'MM'), 1), 'ADD_MONTHS(trunc(SYSDATE, ''MM''),1)')
commit
end
/
ALTER session SET nls_date_format='yyyy-mm-dd hh24:mi:ss'
-- 查询作业.
SELECT job, what, next_date, interval FROM user_jobs
JOB
----------
WHAT
--------------------------------------------------------------------------------
NEXT_DATE
-------------------
INTERVAL
--------------------------------------------------------------------------------
62
ResetSeqTestno
2013-03-01 00:00:00
ADD_MONTHS(trunc(SYSDATE, 'MM'),1)
你是要修改数据库里面, 某个表的 自动递增列的 开始id ?那你那个表里面, 当前有没有数据?
如果已经有数据了, 你再从1开始, 那后面就要出错了。
如果表是空表, 没有数据的, 那么可以
TRUNCATE TABLE 表名字
通过彻底清空 指定表的方式, 来重置那个 自动递增的当期值为 1
注:以上处理方式
对于 SQL Server 数据库的 identity (1,1)
或者 MySQL 的 AUTO_INCREMENT 是有效的。
如果是 Oracle 数据库的话, 你可能需要去重新创建序列号对象。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)