Zufällige eindeutige Zahl (nicht ID)

tommy0014

Benutzer
Beiträge
7
Guten Tag,
für meine Anwendung habe ich eine Tabelle mit drei Spalten:
Name | Typ | Nummer
Name ist ID und die Kombination aus Typ und Nummer muss eindeutig sein. Typ kann auch nur bestimmte Werte annehmen. z.B. "Fußball" "Basketball".
Nun ist mir die Nummer fast egal. Sie muss nur zwischen 1 und 100 liegen und eben die Kombination aus Typ und Nummer eindeutig sein.
Kann ich mir die Nummer generieren lassen? Möchte die nicht händisch eintragen.
Arbeite mit Java und JPA.

Mit freundlichen grüßen
tommy
 
Werbung:
Guten Tag,
für meine Anwendung habe ich eine Tabelle mit drei Spalten:
Name | Typ | Nummer
Name ist ID und die Kombination aus Typ und Nummer muss eindeutig sein.
Unique Index über eide Spalten

Typ kann auch nur bestimmte Werte annehmen. z.B. "Fußball" "Basketball".
Mit Foreign Keys arbeiten

Nun ist mir die Nummer fast egal. Sie muss nur zwischen 1 und 100 liegen und eben die Kombination aus Typ und Nummer eindeutig sein.

1-100 je Typ oder insgesamt? Generell über eine Sequence, wenn je Typ eigenere Kreis dann wird es tricky, ich denke da an passende Trigger, die a) die Sequencen erstellen und b) die Werte ziehen.

Oraggle sollte all das können, in PG könnt ich es Dir zeigen.
 
danke für deine Antwort.
Ja das mit Unique Index und das die Typ-Spalte nur bestimmte Werte annehmen kann habe ich hinbekommen. Habe es aber über ein Check-Constraint gelöst.
Edel wäre 1-100 je Typ. Was ist PG ? :oops:
 

Mal so als Vorkaffee-Fingerübung zum wachwerden:

Code:
test=# create table typ (id int primary key, val text);
CREATE TABLE
test=*# insert into typ values (1, 'foo');
INSERT 0 1
test=*# insert into typ values (2, 'bar');
INSERT 0 1
test=*# create sequence seq_foo;
CREATE SEQUENCE
test=*# create sequence seq_bar;
CREATE SEQUENCE
test=*# create table tommy(typ int references typ, counter int);CREATE TABLE
test=*# create or replace function get_counter() returns trigger as $$declare sql text;tmp text;begin select into tmp val from typ where id=new.typ; sql:='select nextval(''seq_' || tmp || ''')'; execute sql into new.counter; return new;end;$$language plpgsql;
CREATE FUNCTION
test=*# create trigger trg1 before insert on tommy for each row execute procedure get_counter();
CREATE TRIGGER
test=*# insert into tommy(typ) values (1);
INSERT 0 1
test=*# insert into tommy(typ) values (1);
INSERT 0 1
test=*# insert into tommy(typ) values (2);
INSERT 0 1
test=*# select * from tommy ;
 typ | counter
-----+---------
  1 |  1
  1 |  2
  2 |  1
(3 rows)
 
Mal so als Vorkaffee-Fingerübung

Nachtrag:

Code:
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
  [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
  [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
  [ OWNED BY { table_name.column_name | NONE } ]

Du kannst da also einbauen, daß es nur bis 100 geht (MAXVALUE) und dann Schluß ist (NO CYCLE). Wenn 100 erreicht sind ist halt Schluß mit Lustig. Und/oder das als Check-Constraint auf die Spalte (also daß da nur 1-100 und unique in Verbindung mit der typ-Spalte)
 
den Code von dir kann ich aber nicht auf ner Oracle XE ausführen oder ich stell mich gerade nur einwenig blöd an?
Vermutlich nicht 1:1, prinzipiell halte ich aber Oraggle dazu fähig. (auch wenn PG Features hat, die Oraggle nicht hat)

vielen dank für deine hilfe

Dafür gibts übrigens den 'Gefällt mir' - Knopf hier im Forum ;-)
 
ok habe eine Lösung nach deinem Ansatz gebastelt. Mein Code:
Code:
CREATE OR REPLACE TRIGGER MEIN_TRIGGER_TRG
BEFORE INSERT ON MEINE_TABELLE
FOR EACH ROW
DECLARE
  counter NUMBER(4);
BEGIN
  SELECT COUNT('TYP') INTO counter FROM meine_tabelle WHERE typ = :NEW.TYP;
  counter := counter+1;
  IF counter < 100 THEN
    :NEW.NUMMER := counter;
  END IF;
END;

wenn 100 oder mehr als 100 dann knallt es halt :D
 
Code:
create table schema.table (id int primary key, val Varchar2(2000));
create sequence unique_id start with 1 maxvalue 100 increment by 1 no cycle;
create trigger thisTrigger before insert on schema.table
for each row
  begin
  Select unique_id.nextval into :new.id from dual;
  end;

Mehr brauchts nicht... :)

(Mal ganz davon ab, das die Variable counter für jeden Insert neu deklariert wird ^^)
 
Werbung:
Zurück
Oben