0

我在 oracle 中有很多表,但它们都没有主键。

更重要的是,我们的应用程序已经部署到离线模型的客户端服务器上。

现在我们想知道是否可以构建一个补丁来更新表而不更改现有记录:

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

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

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

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

4

1 回答 1

1

您需要创建列,然后使用唯一值填充它,然后再使其成为主键。这个答案显示了如何使用序列来做到这一点,这就是您在 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 处理现有行。添加触发器以自动设置未来行的键值:

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

将上面显示的所有命令(按顺序)放入脚本中,您将修复该myTable表。根据需要对其余表重复。

并且在未来,从一开始就实现主键。表没有主键是非常罕见的,知道何时表不需要主键是一项非常高级的技能。您最安全的选择是始终拥有一个主键。

于 2013-05-28T02:32:22.473 回答