Sql 为Oracles DB向现有表添加唯一约束的好方法?
现有的表有三列,它们都构成主键Sql 为Oracles DB向现有表添加唯一约束的好方法?,sql,oracle,Sql,Oracle,现有的表有三列,它们都构成主键 向其中添加唯一列的最佳方式是什么?在即时消息处理时为其创建一个序列。您可以使用ALTER table ALTER TABLE table_name ADD( new_column_name NUMBER UNIQUE ); 您可以创建一个新序列,然后创建一个触发器,使用该序列填充新列 CREATE SEQUENCE sequence_name; CREATE TRIGGER trigger_name BEFORE INSERT ON table_nam
向其中添加唯一列的最佳方式是什么?在即时消息处理时为其创建一个序列。您可以使用
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版本,则触发器需要从DUAL
执行选择,以填充:new.new\u column\u 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
但是,将新的序列生成列添加到具有复合主键的现有表中似乎非常奇怪,除非目标是将该新列用作主键。生成序列列的全部意义在于,您可以拥有一个稳定的、合成的主键,而不依赖于实际的业务数据。因此,删除现有主键,添加新列,填充数据,将新列声明为新主键,然后在组成旧主键的三列上定义唯一约束似乎更有意义。您的意思是向主键添加唯一列,或者仅仅是表?在该列上添加列和唯一约束。因为我不能对另一个表对第一个表进行外键约束,因为它的主键由它所拥有的三列组成。所以我想创建一个唯一的列,这样我就可以从另一个表中引用它。我没有意识到我可以向alter表中添加unique,因为我认为NULL是相同的,因此不是唯一的。。。谢谢贾斯汀!我会按照你的建议去做,使用一个唯一的键来引用其他表,而主键是空的,这看起来很奇怪。唯一约束的要点是它们可以包含空值。因此,向填充表中添加唯一列比向主键表中添加唯一列更容易(尽管主键表没有那么复杂)。值得注意的是:Sql Server在这方面的行为与oracle不同。唯一约束列仅包含一个null,假设有一列唯一约束。Bravid的好文章展示了一个脚本示例。