2012-01-31 2 views
3

Я хочу добавить столбец в существующую базу данных Firebird (версия 2.5) и написать процедуру, с помощью которой я могу присвоить каждой записи другое значение. Что-то вроде добавления столбца и автогенерации данных для него.Добавление уникального столбца в существующую базу данных sql

Как, если я добавляю новый столбец с именем «ИД» (номер), я хочу, чтобы потом инициализировать уникальное значение для каждой из записей. Итак, в моем столбце ID будут указаны записи от 1 до 500. Как я могу достичь этого, используя только sql-скрипт (т. Е. Без использования какого-либо языка программирования высокого уровня для генерации SQL-команд)?

В основном то, что мне нужно что-то вроде identity колонок в Firebird 3.0:

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

ответ

2

Эти столбцы будут иметь значение по умолчанию 1:

alter table MY_TABLE add ID int default 1 

Вы можете иметь автоинкрементный ПК с помощью генератор и триггер ДО НАЧАЛА ВСТАВКИ:

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 

I не понял, когда вам нужны случайные данные, которые вы сказали.

отмечают, что это два разных примера, они не будут использоваться на вместе на одной и той же колонке

+0

Может быть, я не был достаточно точным при формулировке моего вопроса. Мне не нужны случайные данные в новом столбце. Просто регулярное автоинкрементное значение, начинающееся с 1 (или 0 или 10, это не имеет значения). Проблема в том, что мне нужно добавить новый столбец в уже заполненную таблицу. Вы уверены, что триггер будет активирован для существующих записей? – truthseeker

+1

Нет, триггер не будет обновлять существующие записи, вам нужно выпустить инструкцию для обновления: 'UPDATE MY_TABLE SET ID = GEN_ID (GEN_PK, 1)' – ain

+0

Это то, что я хотел. – truthseeker

0

мне пришлось добавить еще один ответ, потому что я не могу написать @id более чем один раз на комментарий

Нет, триггер не будет запускать существующие столбцы. Вы можете использовать @ain решение или сделать что-то вроде этого, прежде чем создать триггер:

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

Это синтаксис MsSQL. Он не будет работать в Firebird. –

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 

 Смежные вопросы

  • Нет связанных вопросов^_^