Sql 使用序列创建自动合成主键
我有一个带有VARCHAR主键的表,它包含在多个列中。其中一列是最大值为100个不同值的VARCHAR 我想生成一个新表,使用序列将PK的这个特定VARCHAR列更改为整数,问题是我使用的序列为每一行生成不同的Id,它不会对不同的现有Id进行分组Sql 使用序列创建自动合成主键,sql,oracle11g,primary-key,Sql,Oracle11g,Primary Key,我有一个带有VARCHAR主键的表,它包含在多个列中。其中一列是最大值为100个不同值的VARCHAR 我想生成一个新表,使用序列将PK的这个特定VARCHAR列更改为整数,问题是我使用的序列为每一行生成不同的Id,它不会对不同的现有Id进行分组 CREATE SEQUENCE my_seq MINVALUE 1 START WITH 1 INCREMENT BY 1 如何创建此序列,以便将不同行上相同的键值分组?步骤1-创建一个包含所有旧PK列和新序列驱动列的新表 步骤2:插入到新表中,作为
CREATE SEQUENCE my_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
如何创建此序列,以便将不同行上相同的键值分组?步骤1-创建一个包含所有旧PK列和新序列驱动列的新表 步骤2:插入到新表中,作为从旧表中选择不同的列 步骤3:向原始表中添加新的PK列
步骤4使用列匹配的新表中的新PK更新原始表。您应该在测试环境中执行此操作。首先,只有当你100%确定要在其他系统上做这件事时,才非常小心。我们没有您系统的结构或数据,因此您需要使此通用解决方案适合您的需要我们不承担任何责任:)
SQL>create table old_table(object_name varchar2(30)、object_type varchar2(19)、val_1 varchar2(20)、val_2 varchar2(20),
主键(对象名称、对象类型);
表已创建。
SQL>desc旧表
名称为空?类型
----------------------------------------- -------- ----------------------------
对象名称不为空VARCHAR2(30)
对象类型非空VARCHAR2(19)
瓦卢1瓦查尔2(20)
瓦卢2瓦查尔2(20)
--你可以看到这个表有你的带有复合pk的表,包括(object_name和object_type)——就像你的表一样。
SQL>l
1插入到旧表中
2选择对象名称、对象类型、状态、时间戳
3*来自所有_对象
SQL>/
已创建7289行。
--我们刚刚创建了一些测试数据——类似于表数据
SQL>l
1选择对象类型,计数(*)
2从旧桌子
3*按对象类型分组
SQL>/
对象类型计数(*)
------------------- ----------
消费群体2
第1版
附表3
序列13
接线员45
程序31
窗口9
SQL> create table old_table (object_name varchar2(30), object_type varchar2(19), val_1 varchar2(20), val_2 varchar2(20),
primary key(object_name, object_type));
Table created.
SQL> desc old_table
Name Null? Type
----------------------------------------- -------- ----------------------------
OBJECT_NAME NOT NULL VARCHAR2(30)
OBJECT_TYPE NOT NULL VARCHAR2(19)
VAL_1 VARCHAR2(20)
VAL_2 VARCHAR2(20)
-- you can see this table has your table with composit pk , consists of (object_name and object_type) -- like your table.
SQL> l
1 insert into old_table
2 select object_name, object_type, status, timestamp
3* from all_objects
SQL> /
7289 rows created.
-- we just created some test data --similar to your table data
SQL> l
1 select object_type,count(*)
2 from old_table
3* group by object_type
SQL> /
OBJECT_TYPE COUNT(*)
------------------- ----------
CONSUMER GROUP 2
EDITION 1
SCHEDULE 3
SEQUENCE 13
OPERATOR 45
PROCEDURE 31
WINDOW 9
SCHEDULER GROUP 4
DESTINATION 2
PACKAGE 296
PROGRAM 11
XML SCHEMA 31
TRIGGER 2
JOB CLASS 2
SYNONYM 3974
VIEW 1579
TABLE 96
FUNCTION 163
INDEXTYPE 8
INDEX 21
TYPE 995
EVALUATION CONTEXT 1
22 rows selected.
-- here you can see total rows are 7289 but unique object_types( part of composit pk ) is only 22 distinct values..
SQL> CREATE TABLE NEW_TABLE1(ID NUMBER PRIMARY KEY, OBJECT_TYPE VARCHAR2(19));
Table created.
SQL> DESC NEW_TABLE1
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
OBJECT_TYPE VARCHAR2(19)
SQL>
-- here we created a new table with --id number-- as pk, and your obejct_type as value
CREATE SEQUENCE MY_SEQ MINVALUE 1 START WITH 1 INCREMENT BY 1;
SQL> INSERT INTO NEW_TABLE1
2 SELECT MY_SEQ.NEXTVAL, OBJECT_TYPE FROM (SELECT DISTINCT OBJECT_TYPE FROM OLD_TABLE);
22 rows created.
SQL> SELECT * FROM NEW_TABLE1;
ID OBJECT_TYPE
---------- -------------------
1 CONSUMER GROUP
2 EDITION
3 SCHEDULE
4 SEQUENCE
5 OPERATOR
6 PROCEDURE
7 WINDOW
8 SCHEDULER GROUP
9 DESTINATION
10 PACKAGE
11 PROGRAM
12 XML SCHEMA
13 TRIGGER
14 JOB CLASS
15 SYNONYM
16 VIEW
17 TABLE
18 FUNCTION
19 INDEXTYPE
20 INDEX
21 TYPE
22 EVALUATION CONTEXT
22 rows selected.
-- now we add new column to old/existing table
alter table old_table add (new_number_pk number);
-- update the new column with id/number data
SQL> update old_table set new_number_pk = ( select id from new_table1 where object_type = old_table.object_type);
7289 rows updated.
SQL> select * from old_table where rownum < 20 order by object_type ;
OBJECT_NAME OBJECT_TYPE VAL_1 VAL_2 NEW_NUMBER_PK
------------------------------ ------------------- -------------------- -------------------- -------------
V$FLASHBACK_DATABASE_STAT SYNONYM VALID 2011-08-28:22:11:07 15
V$PARAMETER SYNONYM VALID 2011-08-28:22:11:07 15
V$RESTORE_POINT SYNONYM VALID 2011-08-28:22:11:07 15
V$ROLLNAME SYNONYM VALID 2011-08-28:22:11:07 15
V$ROLLSTAT SYNONYM VALID 2011-08-28:22:11:07 15
V$UNDOSTAT SYNONYM VALID 2011-08-28:22:11:07 15
V$SGA SYNONYM VALID 2011-08-28:22:11:07 15
V$CLUSTER_INTERCONNECTS SYNONYM VALID 2011-08-28:22:11:07 15
V$CONFIGURED_INTERCONNECTS SYNONYM VALID 2011-08-28:22:11:07 15
V$ROWCACHE_SUBORDINATE SYNONYM VALID 2011-08-28:22:11:07 15
V$PARAMETER2 SYNONYM VALID 2011-08-28:22:11:07 15
V$OBSOLETE_PARAMETER SYNONYM VALID 2011-08-28:22:11:07 15
V$SYSTEM_PARAMETER SYNONYM VALID 2011-08-28:22:11:07 15
V$SYSTEM_PARAMETER2 SYNONYM VALID 2011-08-28:22:11:07 15
V$SPPARAMETER SYNONYM VALID 2011-08-28:22:11:07 15
V$PARAMETER_VALID_VALUES SYNONYM VALID 2011-08-28:22:11:07 15
V$ROWCACHE SYNONYM VALID 2011-08-28:22:11:07 15
V$ROWCACHE_PARENT SYNONYM VALID 2011-08-28:22:11:07 15
V_$RESTORE_POINT VIEW VALID 2011-08-28:22:11:07 16
19 rows selected.
-- drop old primary key
SQL> alter table old_table drop primary key;
Table altered.
-- mark object_type column unused in old_table
SQL> alter table old_table set unused column object_type;
Table altered.
-- crate new pk with new column on old_table
SQL> alter table old_table
2 add constraint pk_old_table primary key(object_name, new_number_pk);
Table altered.
-- drop unused column
SQL> alter table old_table drop unused columns;
Table altered.