为Oracle DB添加唯一约束到现有表的好方法?

时间:2011-12-01 16:12:48

标签: sql oracle

现有的表有三列,它们都构成了主键。

向其中添加唯一列的最佳方法是什么?在我的时候,可以为它创造一个序列。

1 个答案:

答案 0 :(得分:3)

您可以向具有ALTER TABLE

的表格添加其他列
ALTER TABLE table_name
  ADD( new_column_name NUMBER UNIQUE );

您可以创建一个新序列,然后创建一个使用该序列填充新列的触发器

CREATE SEQUENCE sequence_name;

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.new_column_name := sequence_name.nextval;
END;

如果您使用的是11g之前的Oracle版本,那么您的触发器需要从SELECT执行DUAL才能填充:new.new_column_name列,而不是直接分配

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT sequence_name.nextval
    INTO :new.new_column_name 
    FROM dual;
END;

据推测,您还希望在开始插入新行之前使用序列值初始化所有现有行

UPDATE table_name
   SET new_column_name = sequence_name.nextval
 WHERE new_column_name IS NULL

但是将新的序列生成列添加到具有复合主键的现有表似乎很奇怪,除非目标是使用该新列作为主键。拥有序列生成列的重点是,您拥有一个不依赖于实际业务数据的稳定的合成主键。因此,删除现有主键,添加新列,填充数据,将新列声明为新主键,然后在包含旧主键的三列上定义唯一约束似乎更有意义键。