Nytt, fräscht och intressant inom systemutvecklingssfären med tonvikt på .NET

2007-01-16

Lägga till en sekvens till befintlig tabell

Råkade ut för ett litet problem med en tabell (Oracle 9) som var skapad för flera år sedan. Denna tabell hade en primärnyckel som var beroende av fyra kolumner i tabellen. Tabellen saknade en kolumn av typen integer och som var kopplad till en sekvens (dvs automatiskt uppräknande). Av olika orsaker behövde jag göra om tabellen för att få denna typ av kolumn. Eftersom tabellen innehöll över 4000 rader var det uteslutet att manuellt uppdatera varje rad.

Vad behöver göras?
  • Skapa en ny kolumn av typen int
  • Fylla kolumnen med unika tal
  • Göra kolumnen till primärnyckel för tabellen

Problem
Att fylla kolumnen med unika data.

Lösning

  1. Skapa kolumnen 'id' i tabellen 'large_table'
  2. Skapa en sekvens 'seq_id' för kolumnen
  3. Skapa en temporär trigger 'trg_id' som körs när 'id' sätts lika med -1
  4. Kör följande SQL-sats: UPDATE large_table SET id=-1
  5. Verifiera att alla rader fått unika data
  6. Ta bort trigger
  7. Sätt primärnyckeln på kolumnen 'id'

Sekvens

CREATE SEQUENCE seq_id
START WITH 1
MAXVALUE
999999999999999999999999999
MINVALUE 0

NOCYCLE
NOCACHE
NOORDER;

Trigger

CREATE OR REPLACE TRIGGER trg_id
BEFORE UPDATE ON large_table FOR EACH
ROW
DECLARE
v_id NUMBER(10) := NULL;
CURSOR
cur_sequence IS SELECT seq_id.NEXTVAL AS pk FROM
DUAL;

BEGIN
OPEN cur_sequence;
FETCH
cur_sequence INTO v_id;
CLOSE cur_sequence;


IF (:new.id = -1) then
:new.id := v_id;
END IF;
END;

Etiketter: ,