【问题标题】:Copy data in a table without auto incremented column in oracle在oracle中复制没有自动递增列的表中的数据
【发布时间】:2017-12-19 10:56:53
【问题描述】:

我已将表从本地数据库复制到生产数据库。但是这里发生的是我的自动递增列值也被复制了。我不想那样。

这里我的自动递增列是表TBL_RRSOC_STORE_INFO中的RRSOC_ID

那么现在我应该怎么做,因为它在没有该列的情况下被复制。我试过这样,但数据没有被复制。

create table TBL_RRSOC_STORE_INFO1 as ( select * from TBL_RRSOC_STORE_INFO where 1=0);

下面是我的表结构。

CREATE TABLE "APP_WFM"."TBL_RRSOC_STORE_INFO" 
  ( "RRSOC_ID" NUMBER, 
"STORE_CODE" NVARCHAR2(55), 
"STATE" NVARCHAR2(55), 
"CITY" NVARCHAR2(55), 
"SITE_STORE_FORMAT" NVARCHAR2(155), 
"STORE_SITENAME" NVARCHAR2(255), 
"STORE_SITENAME_LANDL_1" NVARCHAR2(155), 
"STORE_SITENAME_LANDL_2" NVARCHAR2(155), 
"STORE_ASST_MANAGER_NAME" NVARCHAR2(155), 
"STORE_ASST_MANAGER_MOBNO" NVARCHAR2(100), 
"STORE_MANAGER_NAME" NVARCHAR2(155), 
"MANAGER_MOBNO" NVARCHAR2(100), 
"EMP_NEAREST_STORE" NVARCHAR2(155), 
"EMP_NEAREST_STORE_MOBNO" NVARCHAR2(100), 
"SUPERVISOR_NAME" NVARCHAR2(155), 
"SUPERVISOR_MOBNO" NVARCHAR2(155), 
"SECURITY_SUP_NAME_STORE" NVARCHAR2(155), 
"SECURITY_SUP_MOBNO_STORE" NVARCHAR2(155), 
"NAME_ALIGNED_LPO" NVARCHAR2(155), 
"LPO_MOBILENO" NVARCHAR2(100), 
"ALPM_ALPO_NAME" NVARCHAR2(155), 
"ALPM_ALPO_MOBNO" NVARCHAR2(155), 
"AREA_MANAGER_NAME" NVARCHAR2(155), 
"AREA_MANAGER_MOBNO" NVARCHAR2(155), 
"ZONAL_HEAD_NAME" NVARCHAR2(155), 
"ZONAL_HEAD_NO" NVARCHAR2(155), 
"DVR_IP_ADDRESS" NVARCHAR2(255), 
"SIGNET_IP_ADDRESS" NVARCHAR2(155), 
"NEAREST_POLICE_STN_NAME" NVARCHAR2(255), 
"NEAREST_POLICE_STN_CONTNO" NVARCHAR2(255), 
"NEAREST_HOSP_NAME" NVARCHAR2(255), 
"NEAREST_HOSP_CONTNO" NVARCHAR2(255), 
"NEAREST_FIRE_STN_CONTNAME" NVARCHAR2(255), 
"NEAREST_FIRE_STN_CONTNO" NVARCHAR2(255), 
"STORE_SPACE_SQFT" NVARCHAR2(155), 
"STORE_ADDRESS" NVARCHAR2(555), 
"LAUNCH_DATE" DATE, 
"CST_TIN_NO" NVARCHAR2(55), 
"STORE_EMAILID" NVARCHAR2(155), 
"NO_OF_POS" NVARCHAR2(155), 
"NO_OF_CAMERA" NVARCHAR2(155), 
"DVR_MODEL_GESECURITY" NVARCHAR2(155), 
"CAMERA_MODEL" NVARCHAR2(155), 
"ALIGNED_LPO_MAILDID" NVARCHAR2(155), 
"FACILTY_TEAMNAME" NVARCHAR2(155), 
"FACILITY_TEAMNO" NVARCHAR2(155), 
"STATE_HEAD_OPS_NAME" NVARCHAR2(255), 
"STATE_HEAD_OPS_NO" NVARCHAR2(355), 
"LPA" NVARCHAR2(255), 
"SLP_STATE_HEAD" NVARCHAR2(255), 
"SLP_STATE_HEAD_NO" NVARCHAR2(255), 
"CREATED_BY" NVARCHAR2(255), 
"CREATED_DATE" DATE, 
"LAST_UPDATED_BY" NVARCHAR2(155), 
"LAST_UPDATED_DATE" DATE, 
"ISACTIVE" CHAR(1 BYTE), 
"LATITUDE" NVARCHAR2(100), 
"LONGITUDE" NVARCHAR2(100), 
"DELETED_BY" NVARCHAR2(255)
 ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
 STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
 TABLESPACE "APP_WFM" ;

【问题讨论】:

  • mysqloracle?
  • @TomJMuthirenthi:对不起我的错误。它的oracle
  • 你为什么不直接列出你想要的列,而不是使用select *
  • @AlexPoole:我有超过 50 列,所以我添加了每个列名..
  • 是的,你应该已经这样做了。尽可能避免使用“SELECT * FROM”(基本上是在任何地方,除了快速测试目的)。

标签: oracle create-table


【解决方案1】:

使用

select * from TBL_RRSOC_STORE_INFO where 1=0

将创建具有与原始列和数据类型相同的表,但没有数据。源表中的任何行都不会匹配 where 1=0,但结果集的元数据仍然是确定的,并用于在 CTAS 语句中创建新表。

如果您想创建没有列之一的新表,您可以列出您确实明确需要的列:

create table TBL_RRSOC_STORE_INFO1 as
select STORE_CODE, STATE, CITY, ...
from TBL_RRSOC_STORE_INFO;

如果您想包含该列但不包含其值,您可以使用虚拟值包含它:

create table TBL_RRSOC_STORE_INFO1 as
select cast(null as number) as RRSOC_ID, STORE_CODE, STATE, CITY, ...
from TBL_RRSOC_STORE_INFO;

如果您在列出所有列时遇到问题,您可以从数据字典中生成,例如:

select 'create table TBL_RRSOC_STORE_INFO1 as select '
  || listagg(column_name, ',') within group (order by column_id)
  || ' from TBL_RRSOC_STORE_INFO;'
from user_tab_columns
where table_name = 'TBL_RRSOC_STORE_INFO'
and column_name != 'RRSOC_ID';

然后运行生成的语句(当然是在检查之后)。

或者,您可以复制整个表,然后删除 RRSOC_ID 列,或将其更新为 null,或任何您想要的新值。

请注意,表约束和触发器不会自动重新创建,因此即使 RRSOC_ID 是原始表中的主键,您也可以在新表中将其设置或更改为 null。

【讨论】:

  • 对于你的第二个答案,它也会复制数据吗?
  • 他们都会复制数据,是的,因为我忽略了where 1=0 过滤器。您使用哪个取决于您是否希望该列在新表中根本不存在,或者存在但所有值都为空。
  • 我正在这样做create table TBL_RRSOC_STORE_INFO as select STORE_CODE, ... from TBL_RRSOC_STORE_INFO2;,但得到错误SQL Error: ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
  • 您最初的尝试是 create table TBL_RRSOC_STORE_INFO1,因此它的名称与源名称不同。不过,您之前的尝试可能也已经创建了该(空)表,因此您需要先删除它,然后再尝试再次创建它。但要非常小心 - 确保你只删除新的,并且它实际上没有你需要的任何东西......你现在似乎至少有三个表名并且不清楚任何处于什么状态. 但是,您不想删除包含所有真实数据的原始数据。
  • 看到我的主表是TBL_RRSOC_STORE_INFO,我已经将它的数据复制到TBL_RRSOC_STORE_INFO2,所以我删除了主表并由你的查询创建。但我没有将 RRSOC_ID 的值作为其主键
猜你喜欢
  • 2016-04-25
  • 2014-01-06
  • 2019-01-09
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2013-12-12
相关资源
最近更新 更多