2016-03-06 3 views
1

J'ai regardé partout dans les 3 dernières heures mais je n'arrive toujours pas à faire fonctionner cela. Je dois être capable de concaténer la valeur 1prefix et 1suffix pour former un identifiant composé de chaîne et de nombre.Dans Derby DDL comment concaténer la chaîne et le nombre comme identité

Comment définir la table.

create table dicounts_list 
(
    DISCOUNT_PREFIX CHAR(20) NOT NULL WITH DEFAULT 'DISC', 
    DISCOUNT_SUFFIX INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 0001, INCREMENT BY 1), 
    DISCOUNT_ID CHAR --concatenated values of DISCOUNT_PREFIX and DISCOUNT_SUFFIX e.g DISC0001 
    DISCOUNT_NAME VARCHAR(30) NOT NULL, 
    PRIMARY KEY(DISCOUNT_ID) 
); 

Je dois être en mesure de générer

DISC0001 DISC0002 DISC0003

sur lequel seul le nombre d'auto-incrémentation chaque insertion DiscounName. Je veux juste préfixer la clé primaire avec "DISC" comme identifiant de remise.

J'utilise Derby. J'apprécierais vraiment si vous pouvez m'aider avec ceci ou fournir avec la solution alternative.

Merci.

+1

Je laisse la colonne 'IDENTITY' tel qu'il est et ajouter le préfixe dans l'accès aux données/logique d'application, en utilisant un' NumberFormat' pour le rembourrage avec des zéros à gauche. –

+0

Vous voulez que 'DISC' soit dans sa propre colonne, mais vous ** voulez aussi que ce soit les quatre premiers caractères de chaque valeur de clé primaire? –

Répondre

0

Une colonne générée devrait faire le travail. Je n'ai pas de Derby pour tester mais suivant fonctionnerait dans DB2

create table t4 (prefix varchar(20) not null with default 'DISC', 
       suffix int generated always as identity (start with 1 increment by 1), 
       id generated always as (prefix || (substr2('000' || suffix, -4, 4)))) 
0

Une alternative est d'utiliser un SEQUENCE et la syntaxe NEXT VALUE FOR pour générer de nouvelles valeurs pour vos clés primaires, comme indiqué ici: http://db.apache.org/derby/docs/10.12/ref/rrefsqljnextvaluefor.html

par exemple, vous pouvez faire:

create sequence discount_ids start with 1; 
insert into discounts (id, name) 
    values ('DISC' || cast(next value for discount_ids as char(20)), 
      'bubble gum');