2013-05-28 81 views
0

我在oracle中有很多表,但没有一个主键。为批处理表添加自动增加主键的批处理脚本

此外,我们的应用程序已经部署到脱机模式的客户端服务器。

现在我们想知道,如果我们能够建立一个补丁更新表,而不用改变存在的记录:

1)添加主键每个表(如id)。

2)使这个主键自动增加。

3)更新表格以填充主键列。

所以我想知道是否可以创建一个批处理脚本来完成上述工作,然后我可以将它发送给我们的客户进行更新?

回答

1

您需要创建该列,然后在使其成为主键之前使用唯一值填充该列。这个答案显示了如何使用sequences来做到这一点,这就是你如何在Oracle中自动递增值。

  1. 添加将作为主键的列(它不能设置为主键)。此示例将该列定义为NUMBER(12),该列与自然数序列一起为您提供10^12 - 1个可能的键值。如果您认为您需要更多或更少,请相应地调整列大小。

    ALTER TABLE myTable ADD myTableID NUMBER(12); 
    
  2. 创建一个用于生成唯一值的Oracle SEQUENCE。我通常通过将Seq添加到它们将生成值的表的名称来命名序列;你应该把它们命名为你喜欢的。该序列将开始处的值1(START WITH 1),并且因为没有增量被定义它将被1

    CREATE SEQUENCE myTableSeq START WITH 1; 
    
  3. 更新新列递增与从该序列值。这将分配唯一值的每一行:

    UPDATE myTable SET myTableID = myTableSeq.NEXTVAL; 
    
  4. 现在,该列的值可以被指定作为主键(第3步之前,指定其作为主键会失败,因为其所有的值分别为因此不是唯一的):

    ALTER TABLE myTable ADD PRIMARY KEY (myTableID); 
    
  5. 步骤1-4处理现有行。添加trigger自动设置键值为未来行:

    CREATE OR REPLACE TRIGGER myTablePKSet 
    BEFORE INSERT ON myTable 
    FOR EACH ROW 
    BEGIN 
        :NEW.myTableID := myTableSeq.NEXTVAL; 
    END; 
    /
    

将如上图所示(按顺序)的所有命令到一个脚本,你必须为myTable表的修补程序。根据需要重复其余表格。

而且在未来,从一开始就实现主键。 不是有一个主键,这是非常罕见的,并且知道什么时候表不需要一个主键。你最安全的赌注是总是有有一个主键。

+0

谢谢您的详细解答。但是我想知道如果我可以将所有这些命令保存到批处理脚本中并运行它?窗口命令行不会重新规划oracle命令。 – hguser

+0

您可以将命令保存到脚本中,并且您应该首先在您自己的表格副本上对其进行测试。约定是用'.sql'扩展名来命名脚本,例如'AddPK.sql'。至于运行脚本:(1)将它复制到客户端的机器上,(2)在Windows命令行中键入'sqlplus username @ servername/password',(3)一旦你得到'SQL>'提示符,键入at标记('@'),后跟在客户机上保存的脚本的位置和名称,例如'@c:\ temp \ AddPK.sql'。 –

+0

谢谢,我明白了。 – hguser