2010-10-27 14 views
4

J'ai cette requête:Insérer une ligne sans colonne primaire mis

INSERT INTO GOST (ASSORTMENTID, ROZMIAR, GOST) 
VALUES (54,'S','MjgwMzktODkgMTc0LTk2') 

Je veux insérer une nouvelle ligne dans le tableau GOST, mais je ne veux pas spécifier la colonne avec clé primaire - GOSTID. Je veux que cette base de données définisse la prochaine valeur d'identifiant. Quand je lance ce code que j'ai cette erreur:

validation error for column GOSTID, value "* null *"

Je comprends que je dois mettre la colonne GOSTID dans la requête INSERT, oui?

Il est possible de lancer ceci sans ce paramètre?

Répondre

3

Je pense un exemple de script worths plus de 1000 mots:

Aller à une interface shell dans la machine serveur firebird, cd à un dossier dans lequel vous avez des autorisations de lecture/écriture, lancez isql ou isql-fb (dépend sur votre système et la version firebird) et exécutez ce script:

create database 'netmajor.fdb' user 'sysdba' password 'masterkey'; 
set autoddl off; 

create table netmajor_example (
    netmajor_id  integer not null 
    , str_data  varchar(200) 
    , int_data  integer 
    , constraint pk_netmajor_example 
     primary key (netmajor_id) 
); 

create generator netmajor_gen; 

set term ^; 

create trigger netmajor_pkassign 
    for netmajor_example 
active before insert position 1 
AS 
begin 
    if (new.netmajor_id is null) then 
    new.netmajor_id = gen_id(netmajor_gen, 1); 
end 
^ 

commit work^ 

set term ;^


insert into netmajor_example (str_data, int_data) values ('one', 1); 
insert into netmajor_example (str_data, int_data) values ('twenty', 20); 
commit work; 

select * from netmajor_example; 

Jetez un oeil sur les résultats, qui sont ma machine:

; NETMAJOR_ID STR_DATA      INT_DATA 
;============ ============================ ============ 
;   1 one          1 
;   2 twenty         20 

SI vous avez des questions, ne pas hésiter à contacter. Meilleures salutations.

+0

Merci! C'était ce dont j'avais besoin;) Je suppose que cette table a 6 rangées, si je supprime 2 rangées et que j'en insère une suivante, le générateur générera le prochain numéro de rang - 7? – netmajor

+0

Générateur n'est pas directement liée à la table ni une sorte de champ numérique automatique. Si vous voulez un nombre corrélatif parfait, vous devez prendre un autre moyen de l'implémenter. D'autre part, vous avez défini la phrase du générateur x à y et vous pouvez régler manuellement le générateur pour produire le nombre suivant que vous voulez. – jachguate

1

De toute évidence, votre clé primaire est une colonne NOT NULL, ce qui signifie qu'elle est toujours requise. Vous ne pouvez pas insérer une ligne sans donner une valeur pour la clé primaire (à moins qu'il s'agisse d'une colonne "nombre automatique" qui est automatiquement définie par le système de base de données).

+0

Vous pouvez insérer une ligne sans clé primaire si vous donnez la valeur correcte avant insert -trigger, voir ma réponse. – Harriv

+0

@Harriv: oui, vous pouvez le faire - cela signifie, au moment où l'INSERT se produit réellement, vous ** avez une valeur - c'est tout ce que je dis ... –

0

Utilisez le déclencheur "avant insertion" pour définir la valeur de la clé primaire. Firebird n'a pas de type de champ "auto-incrémenté", vous devez donc vous en occuper seul.

Voir http://www.firebirdfaq.org/faq29/ pour le tutoriel comment faire ceci. Certaines applications DB (par exemple Database Workbench) peuvent créer le déclencheur et le générateur automatiquement.