Oracle 删除和重新插入前需要保存数据

Oracle 删除和重新插入前需要保存数据,oracle,constraints,primary-key,Oracle,Constraints,Primary Key,我必须改变现有的表格如下 删除现有主键 添加新的主键 在这方面,我必须在创建新的主键之前删除所有现有数据。然后我需要重新插入数据。该表存在于多个模式中,我需要一个查询或PL/SQL块来执行此功能 我使用了以下查询: ALTER TABLE SCHEMA1.A DROP CONSTRAINT PK_A; ALTER TABLE SCHEMA1.A ADD PID VARCHAR2(40 CHAR); ALTER TABLE SCHEMA1.A ADD (CONSTRAINT PK_A PRIM

我必须改变现有的表格如下

  • 删除现有主键
  • 添加新的主键
  • 在这方面,我必须在创建新的主键之前删除所有现有数据。然后我需要重新插入数据。该表存在于多个模式中,我需要一个查询或PL/SQL块来执行此功能

    我使用了以下查询:

    ALTER TABLE SCHEMA1.A DROP CONSTRAINT PK_A;
    
    ALTER TABLE SCHEMA1.A ADD PID VARCHAR2(40 CHAR);
    
    ALTER TABLE SCHEMA1.A ADD (CONSTRAINT PK_A PRIMARY KEY (PID)); 
    
    它在最后一次查询中失败,原因是

    ORA-01449: column contains NULL values; cannot alter to NOT NULL
    

    我不认为有任何方法可以从一个drop语句中删除多个模式中的表或对象。您可以使用下面提到的PL/SQL,但是在使用它时要小心,可能的话可以使用include WHERE子句

    SET serveroutput ON;  
    
    DECLARE  
    
                CURSOR c    IS   
    
        SELECT username FROM dba_users;
    
      table_check_cnt NUMBER;
    
    
      dropSQL         VARCHAR2(300);
    
    BEGIN  
      dbms_output.put_line('Execution of block starts');   
      FOR c1 IN c   
      LOOP   
        SELECT COUNT(*)   
        INTO table_check_cnt   
        FROM dba_tables   
        WHERE owner       =c1.username   
        AND table_name    ='FOO';    
        IF table_check_cnt=1 THEN   
          dbms_output.put_line('count is '||table_check_cnt);   
          dropSQL := 'drop table '|| c1.username || '.FOO';   
          EXECUTE IMMEDIATE dropsql;   
        END IF;   
      END LOOP;   
    END;   
    

    对于ORA-01449错误,我们在其上创建主要约束的字段上存在一个空记录,因此请删除此字段中每个记录的空值,它也应该是唯一的。

    为什么需要删除数据?您的主键有外键引用吗?到目前为止您尝试了什么?当添加主键约束时,没有执行提到“ORA-01449:列包含空值;不能更改为非空”的语句。您必须用更新填充新的PID列,然后才能使其成为PK。不过,您还没有说明要如何生成它——可能不是从序列生成的,因为它是一个字符串列。您也需要使用delete/insert来实现这一点,但更新是一种更为明显的方法。您需要做的第一件事是决定如何将这些空值转换为实际值。即使您设法将数据复制到其他地方并将其删除。。。插入带有空值和该列PK的数据时会出现错误