我想在现有的Firebird数据库(版本2.5)中添加一个列,并编写一个过程,通过该过程我可以为每个记录分配不同的值。像添加一个列并为其自动生成数据的东西。
就像,如果我添加一个名为“ID”(数字)的新列,我想要为每个记录初始化一个唯一值。因此,我的ID列将具有从1到500的记录。如何通过仅使用sql脚本(即,不使用某种高级编程语言来生成sql命令)来实现此目的?
基本上我需要的是Firebird 3.0中的identity列:
alter table MY_TABLE
add ID int identity(1,1)
答案 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