oracle数据库,怎么给已有数据的表添加自增字段
场景:数据仓库,ODI为使用Oracle Incremental Update IKM,需要对一事实表增加主键。
思想:基于老表创建新表,添加自增字段(序列+触发器实现),把老数据导入新表,删除老表,修改新表名字为老表
[1] 假如有一测试表DEPT,我们要给DEPT表增加ID字段
CREATE TABLE DEPT AS SELECT * FROM SCOTT.DEPT
或者自己创建
DROP TABLE "DEPT";
CREATE TABLE "DEPT" (
"DEPTNO" NUMBER(2) NOT NULL ,
"DNAME" VARCHAR2(14 BYTE) NULL ,
"LOC" VARCHAR2(13 BYTE) NULL
)
;
INSERT INTO "DEPT" VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO "DEPT" VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO "DEPT" VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO "DEPT" VALUES ('40', 'OPERATIONS', 'BOSTON');
【2】创建一个新表DEPT1
方法1: 导出源表结构,增加一个字段ID
CREATE TABLE "DEPT1" (
"ID" NUMBER(2) PRIMARY KEY,
"DEPTNO" NUMBER(2) NOT NULL ,
"DNAME" VARCHAR2(14 BYTE) NULL ,
"LOC" VARCHAR2(13 BYTE) NULL
)
方法2:
---只会复制表数据和表结构,不会有任何约束
CREATE TABLE DEPT1 AS SELECT * FROM DEPT WHERE 1<>1 --添加列
ALTER TABLE "DEPT1" ADD ID NUMBER
ALTER TABLE "DEPT1" ADD PRIMARY KEY ("ID");
【3】创建自增序列
DROP SEQUENCE SEQ_DEPT CREATE SEQUENCE SEQ_DEPT INCREMENT BY 1 START WITH 1 MINVALUE 1 NOMAXVALUE NOCYCLE NOCACHE;
【4】触发器实现ID自增加
DROP TRIGGER TRG_BEFORE_INSERT_DEPT
CREATE TRIGGER TRG_BEFORE_INSERT_DEPT BEFORE INSERT ON DEPT1
FOR EACH ROW
BEGIN
SELECT
SEQ_DEPT.NEXTVAL INTO :NEW.ID
FROM
DUAL ;
END ;
【5】老数据导入新表DEPT1
INSERT INTO DEPT1("DEPTNO", "DNAME", "LOC") SELECT * FROM DEPT
【6】删除旧表DEPT
DROP TABLE DEPT
【7】DEPT1改名为DEPT
RENAME DEPT1 TO DEPT
---或者
ALTER TABLE DEPT RENAME TO DEPT;
【8】触发器会自动更新为新表。
DROP TRIGGER TRG_BEFORE_INSERT_DEPT
CREATE TRIGGER TRG_BEFORE_INSERT_DEPT BEFORE INSERT ON DEPT FOR EACH ROW
BEGIN
SELECT
SEQ_DEPT.NEXTVAL INTO :NEW.ID
FROM
DUAL ;
END ;
最终结果:
oracle数据库,怎么给已有数据的表添加自增字段的更多相关文章
- oracle数据库中修改已存在数据的字段
在oracle中,如果已经存在的数据的某些列,假如要更换类型的话,有的时候是比较麻烦的, 会出现:ORA-01439: column to be modified must be empty to c ...
- sql-向已有数据的表添加约束
语法: alter table 表名 with nocheck add constraint 约束名 约束类型 具体的约束说明 对表中现有的数据不做检查, 只对添加约束后再录入的数据进行检查. 例子: ...
- SQLServer为已有数据的表添加一个自增列
如果我们从Excel中导入到SQL中大量数据时,如果需要再单独处理特别需要一个字段去表示处理到那条数据了,这时因为没有主键就可以使用以下方式为每条数据添加id ,) not null
- Oracle数据库中插入日期型数据(to_date的用法)(转载)
往Oracle数据库中插入日期型数据(to_date的用法) INSERT INTO FLOOR VALUES ( to_date ( '2007-12-20 18:31:34' , 'YYY ...
- SQL语句往Oracle数据库中插入日期型数据(to_date的用法)
Oracle 在操作数据库上相比于其他的 T-sql 有微小的差别,但是在插入时间类型的数据是必须要注意他的 to_date 方法,具体的情况如下: --SQL语句往Oracle数据库中插入日期型数据 ...
- SQL 已有数据的表创建标识列
针对已有数据的表创建标识列: ,) constraint FID_1 primary key(FID)
- 在已有的mysql表中添加自增字段
现有数据表xiami,建表的时候忘记添加自增字段,现需要添加自增字段 第一步:添加字段 alter table xiami add id int; 第二步:修改字段 alter tabel xiami ...
- 使用pymysql循环删除重复数据,并修改自增字段偏移值
创建表: CREATE TABLE `info` ( `id` tinyint NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMAR ...
- oracle数据库管理员简介、导入数据与导出数据
数据库管理员: sys和system的权限区别:sys:所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行时至关重要的,由数据库 自己维护,任何用户都不能 ...
随机推荐
- selector属性介绍
本文来自:http://blog.csdn.net/brokge/article/details/9713041 简介: 根据不同的选定状态来定义不同的现实效果 分为四大属性: android:sta ...
- 使用强大的 Mockito 测试框架来测试你的代码
原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...
- gunicorn结合django启动后台线程
preload 为True的情况下,会将辅助线程或者进程开在master里,加重master的负担(master最好只是用来负责监听worker进程) django应用的gunicorn示例:只在主线 ...
- POJ 1719 Shooting Contest(二分图匹配)
POJ 1719 Shooting Contest id=1719" target="_blank" style="">题目链接 题意:给定一个 ...
- MySQL C API的一个让我头疼的问题,获得一行记录中包括NULL
遇到过几次错误,通过gdb来查看错误对战,发现错误居然是atoi调用出错,除非atoi(NULL) 才会报这种错误.说明 row[0]==NULL. (gdb) bt #0 0x00007f82c66 ...
- Oracle比较2个表内容
Comparing the Contents of Two Tables A表和B表.拥有一致列,C2一列内容不同. I have two tables named A and B. They hav ...
- SD内存卡禁止写入只读怎么办?另类SPI模式修复坏卡
这几天很郁闷,买的32G TF卡老出问题,三星的标,不知道是不是正品,标称C10,且不说是不是真的三星和真的C10,反正测试一下容量倒是真的,价格么也比较亲民,好像是69块? 哎,可惜呀,好景不长 ...
- protobuf Protocol Buffers 简介 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Spring Boot Maven 打包可执行Jar文件!
Maven pom.xml 必须包含 <packaging>jar</packaging> <build> <plugins> <plugin&g ...
- linux性能分析工具集(图示)