我在 oracle 中有很多表,但它们都没有主键。
更重要的是,我们的应用程序已经部署到离线模型的客户端服务器上。
现在我们想知道是否可以构建一个补丁来更新表而不更改现有记录:
1)为每个表添加主键(如id
)。
2)使这个主键自动增加。
3)更新表以填充主键列。
所以我想知道我是否可以创建一个批处理脚本来完成上述工作,然后我可以将它发送给我们的客户进行更新?
我在 oracle 中有很多表,但它们都没有主键。
更重要的是,我们的应用程序已经部署到离线模型的客户端服务器上。
现在我们想知道是否可以构建一个补丁来更新表而不更改现有记录:
1)为每个表添加主键(如id
)。
2)使这个主键自动增加。
3)更新表以填充主键列。
所以我想知道我是否可以创建一个批处理脚本来完成上述工作,然后我可以将它发送给我们的客户进行更新?
您需要创建列,然后使用唯一值填充它,然后再使其成为主键。这个答案显示了如何使用序列来做到这一点,这就是您在 Oracle 中执行自动递增值的方式。
添加将成为主键的列(它还不能设置为主键)。此示例将列定义为NUMBER(12)
,它与自然数序列一起为您提供 10^12 - 1 个可能的键值。如果您认为您或多或少需要相应地调整列大小。
ALTER TABLE myTable ADD myTableID NUMBER(12);
创建一个 Oracle SEQUENCE
,用于生成唯一值。Seq
我通常通过附加到它们将为其生成值的表的名称来命名序列;您应该随意命名它们。该序列将从值 1 ( START WITH 1
) 开始,并且由于未定义增量,它将递增 1。
CREATE SEQUENCE myTableSeq START WITH 1;
使用序列中的值更新新列。这将为每一行分配唯一值:
UPDATE myTable SET myTableID = myTableSeq.NEXTVAL;
现在该列具有值,它可以被指定为主键(在第 3 步之前,将其指定为主键会失败,因为它的所有值都是空的,因此不是唯一的):
ALTER TABLE myTable ADD PRIMARY KEY (myTableID);
步骤 1-4 处理现有行。添加触发器以自动设置未来行的键值:
CREATE OR REPLACE TRIGGER myTablePKSet
BEFORE INSERT ON myTable
FOR EACH ROW
BEGIN
:NEW.myTableID := myTableSeq.NEXTVAL;
END;
/
将上面显示的所有命令(按顺序)放入脚本中,您将修复该myTable
表。根据需要对其余表重复。
并且在未来,从一开始就实现主键。表没有主键是非常罕见的,知道何时表不需要主键是一项非常高级的技能。您最安全的选择是始终拥有一个主键。