将唯一列添加到现有sql数据库

时间:2012-01-31 11:28:25

标签: sql unique add firebird

我想在现有的Firebird数据库(版本2.5)中添加一个列,并编写一个过程,通过该过程我可以为每个记录分配不同的值。像添加一个列并为其自动生成数据的东西。

就像,如果我添加一个名为“ID”(数字)的新列,我想要为每个记录初始化一个唯一值。因此,我的ID列将具有从1到500的记录。如何通过仅使用sql脚本(即,不使用某种高级编程语言来生成sql命令)来实现此目的?

基本上我需要的是Firebird 3.0中的identity列:

alter table MY_TABLE
add ID int identity(1,1)

3 个答案:

答案 0 :(得分:2)

此列的默认值为1:

alter table MY_TABLE add ID int default 1 

您可以使用生成器和BEFORE INSERT触发器自动递增PK:

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 :(得分: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

答案 2 :(得分:0)

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

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

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