web-dev-qa-db-fra.com

ORA-32795: impossible d'insérer dans une colonne toujours générée avec identité

Les gars que j'essaye d'exécuter ci-dessous la déclaration insert et je continue à avoir l'erreur:

ne peut pas insérer dans une colonne toujours générée

la déclaration est:

INSERT INTO leaves_approval 
SELECT * 
FROM   requests_temp r 
WHERE  r.civil_number = 33322 
       AND r.request_id = (SELECT Max(s.request_id) 
                           FROM   requests_temp s)
7
ghalib

Qu'est-ce que tu ne comprends pas à propos de l'erreur? Vous avez une colonne "identité" dans laquelle la valeur est générée sous forme de séquence. Vous ne pouvez pas y insérer. Donc, listez toutes les autres colonnes:

INSERT INTO LEAVES_APPROVAL(col1, col2, col3, . . .) 
    SELECT col1, col2, col3, . . .
    FROM REQUESTS_TEMP r
    WHERE r.CIVIL_NUMBER = 33322 AND
          r.REQUEST_ID = (SELECT MAX(s.REQUEST_ID) FROM REQUESTS_TEMP s);

En règle générale, il est judicieux de répertorier toutes les colonnes de la variable INSERT. Cela évite les erreurs inattendues, car les colonnes sont dans le mauvais ordre ou les tables ont un nombre différent de colonnes.

4
Gordon Linoff

L'une des colonnes de votre table cible (leaves_approval) contient une colonne d'identité définie comme Generated always.
Les colonnes d’identité peuvent être créées selon 2 modes: Généré toujours, que ne peut pas être affecté et Généré par défaut que peut être attribué. 


Si vous le souhaitez, vous pouvez changer le mode de la colonne puis faire votre insertion "telle quelle".
Tenez compte du fait que cela pourrait créer des doublons dans la colonne identité ou échouer en raison de contraintes. 

ALTER TABLE leaves_approval MODIFY **my_identity_column** GENERATED BY DEFAULT AS IDENTITY;

Ou vous pouvez exclure la colonne identité de la liste INSERT (mais vous devrez indiquer la liste complète des colonnes, à l'exception de la colonne identité), par exemple. - 

INSERT INTO leaves_approval (c1,c2,c3,c4,...)
SELECT c1,c2,c3,c4 ...
FROM   requests_temp r 
WHERE  r.civil_number = 33322 
       AND r.request_id = (SELECT Max(s.request_id) 
                           FROM   requests_temp s)

Référence du langage de base de données SQL - CREATE TABLE

TOUJOURS Si vous spécifiez TOUJOURS, Oracle Database utilise toujours le fichier générateur de séquence pour attribuer une valeur à la colonne. Si vous essayez de attribuer explicitement une valeur à la colonne à l'aide de INSERT ou UPDATE, puis de une erreur sera renvoyée. C'est la valeur par défaut.

BY DEFAULT Si vous spécifiez BY DEFAULT, Oracle Database utilise le fichier Générateur de séquence pour assigner une valeur à la colonne par défaut, mais vous peut également attribuer explicitement une valeur spécifiée à la colonne. Si vous indiquez ON NULL, puis Oracle Database utilise le générateur de séquence pour affecter une valeur à la colonne lors d'une instruction INSERT ultérieure tente d'affecter une valeur évaluée à NULL.

3

Exemple: my_table_column NOMBRE GÉNÉRÉ PAR DEFAULT ON NULL COMME IDENTITÉ - si vous définissez la colonne en tant que, elle obtiendra la valeur lorsqu'elle est NULL et n'interférera pas si vous souhaitez insérer/mettre à jour les valeurs de cette colonne. Cela a fonctionné pour moi.

0
senthil kumar raju