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)
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.
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.
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.