现有的表有三列,它们都构成了主键。
向其中添加唯一列的最佳方法是什么?在我的时候,可以为它创造一个序列。
答案 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
但是将新的序列生成列添加到具有复合主键的现有表似乎很奇怪,除非目标是使用该新列作为主键。拥有序列生成列的重点是,您拥有一个不依赖于实际业务数据的稳定的合成主键。因此,删除现有主键,添加新列,填充数据,将新列声明为新主键,然后在包含旧主键的三列上定义唯一约束似乎更有意义键。