Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为Oracles DB向现有表添加唯一约束的好方法?_Sql_Oracle - Fatal编程技术网

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的好文章展示了一个脚本示例。