向现有的 SQL 数据库添加唯一列

3
我想要在一个现有的Firebird数据库 (版本2.5) 中添加一列,并编写一个过程来为每个记录分配不同的值。比如,添加一个名为"ID" (数值) 的新列,我希望能够将唯一值初始化到每条记录中。因此,我的ID列将拥有从1到500的记录。如何只使用SQL脚本实现这一点(即不使用某种高级编程语言来生成sql命令)?
基本上,我需要的是类似于Firebird 3.0中的自增列:identity列。
alter table MY_TABLE
add ID int identity(1,1)
3个回答

2

这些列将默认值为1:

alter table MY_TABLE add ID int default 1 

你可以使用生成器和BEFORE INSERT触发器来自动递增主键: ```html

使用生成器和BEFORE INSERT触发器,您可以拥有一个自动递增的主键:

```
CREATE GENERATOR GEN_PK;
COMMIT;


CREATE TRIGGER GENERATE_PK FOR MY_TABLE
ACTIVE BEFORE INSERT
AS
BEGIN
  IF(NEW.ID IS NULL) THEN 
    NEW.ID = GEN_ID(GEN_PK, 1);
END

虽然你提到需要随机数据,但我不确定具体的需求。

请注意,这两个示例是不同的,不能同时在同一列上使用。


也许我在表达问题时不够精确。我不需要在新列中随机数据,只需要从1(或0、10)开始的常规自动递增值。问题是,我需要将新列添加到已经填充的表中。您确定触发器会对现有记录触发吗? - truthseeker
1
不,触发器不会更新现有记录,您必须发出更新语句:UPDATE MY_TABLE SET ID = GEN_ID(GEN_PK, 1) - ain

1

这个语句会对你有所帮助:

EXECUTE BLOCK
AS
  DECLARE VARIABLE DBKEY CHAR(8);
  DECLARE VARIABLE C INTEGER = 1;
BEGIN
  FOR 
    SELECT 
      RDB$DB_KEY 
    FROM 
      your_table_name 
    INTO 
      :dbkey
  DO BEGIN
    UPDATE your_table_name SET id = :c WHERE rdb$db_key = :dbkey;
    c = :c + 1;
  END
END

0

我不得不添加另一个答案,因为我不能在评论中多次写@id

不,触发器不会对现有列触发。您可以使用@ain解决方案或在创建触发器之前执行此操作:

DECLARE @id INT 
SET @id = 0 
UPDATE MY_TABLE
SET @id = id = @id + 1 
GO 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接