Frage ORA-32795: kann nicht in eine Spalte mit generierter Identität eingefügt werden


Leute, die ich versuche, unterhalb von insert statement auszuführen, und ich bekomme immer wieder den Fehler:

kann nicht in eine Spalte mit generierter Identität eingefügt werden

Die Aussage lautet:

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)

6
2017-12-22 04:42


Ursprung


Antworten:


Was verstehst du nicht über den Fehler? Sie haben eine Spalte "identity", in der der Wert als Sequenz generiert wird. Sie können nicht hinein einfügen. Listen Sie also alle anderen Spalten auf:

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

Im Allgemeinen ist es eine gute Idee, alle Spalten in einem aufzulisten INSERT sowieso. Dies verhindert unerwartete Fehler, da die Spalten in der falschen Reihenfolge sind oder die Tabellen eine unterschiedliche Anzahl von Spalten haben.


3
2017-12-22 04:44



Eine der Spalten in Ihrer Zieltabelle (leaves_approval) enthält eine Identitätsspalte, die als definiert wurde Immer generiert.
Identitätsspalten können in 2 Modi erstellt werden - Immer generiert, Das kann nicht zugewiesen werden und Standardmäßig generiert Das kann zugewiesen werden.


Wenn Sie möchten, können Sie den Spaltenmodus ändern und dann Ihre Eingabe "so wie sie ist" ausführen.
Berücksichtigen Sie, dass dies möglicherweise doppelte Einträge in der Identitätsspalte verursacht oder aufgrund von Einschränkungen fehlschlägt.

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

Oder Sie können die Identitätsspalte von der INSERT-Liste ausschließen (Sie müssen jedoch die vollständige Spaltenliste angeben, mit Ausnahme der Identitätsspalte), z. -

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)

Datenbank-SQL-Sprachreferenz - CREATE TABLE

IMMER Wenn Sie IMMER angeben, verwendet Oracle Database immer die   Sequenzgenerator, um der Spalte einen Wert zuzuordnen. Wenn Sie es versuchen   Weisen Sie der Spalte explizit einen Wert zu, indem Sie INSERT oder UPDATE verwenden   Ein Fehler wird zurückgegeben. Dies ist der Standardwert.

BY DEFAULT Wenn Sie BY DEFAULT angeben, verwendet die Oracle-Datenbank den Befehl   Sequenzgenerator, um der Spalte standardmäßig einen Wert zuzuordnen, aber Sie   Sie können der Spalte auch explizit einen bestimmten Wert zuweisen. Wenn du   Geben Sie ON NULL an, dann verwendet Oracle Database den Sequenzgenerator für   Weisen Sie der Spalte bei einer nachfolgenden INSERT-Anweisung einen Wert zu   versucht, einen Wert zuzuweisen, der NULL ergibt.


1
2017-12-22 07:55