2016-12-22 17 views
5

Guys Tôi cố gắng để thực hiện dưới đây tuyên bố chèn và tôi tiếp tục nhận được lỗi:ORA-32.795: không thể chèn vào một cột sắc tạo luôn

cannot insert into a generated always identity column

tuyên bố là:

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) 

Trả lời

3

gì bạn không hiểu về lỗi sao? Bạn có cột "danh tính", trong đó giá trị được tạo dưới dạng chuỗi. Bạn không thể chèn vào nó. Vì vậy, liệt kê tất cả các cột khác:

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

Nói chung, đó là một ý tưởng tốt để liệt kê tất cả các cột trong một INSERT anyway. Điều này ngăn ngừa các lỗi không mong muốn, bởi vì các cột sai thứ tự hoặc các bảng có số cột khác nhau.

0

Một trong các cột trong bảng mục tiêu của bạn (leaves_approval) chứa cột nhận dạng được định nghĩa là Được tạo luôn.
cột Identity có thể được tạo ra trong 2 chế độ - Generated always, mà không thể được chỉ định và tạo theo mặc định rằng thể được giao.


Nếu bạn muốn, bạn có thể thay đổi chế độ cột và sau đó chèn "như hiện tại".
Hãy cân nhắc rằng điều này có thể tạo các bản sao trong cột nhận dạng hoặc không thành công do các ràng buộc.

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

Hoặc bạn có thể loại trừ cột nhận dạng khỏi danh sách INSERT (nhưng bạn phải chỉ rõ danh sách cột đầy đủ, ngoại trừ cột nhận dạng), ví dụ: -

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) 

Database SQL Language Reference - CREATE TABLE

ALWAYS If you specify ALWAYS, then Oracle Database always uses the sequence generator to assign a value to the column. If you attempt to explicitly assign a value to the column using INSERT or UPDATE, then an error will be returned. This is the default.

BY DEFAULT If you specify BY DEFAULT, then Oracle Database uses the sequence generator to assign a value to the column by default, but you can also explicitly assign a specified value to the column. If you specify ON NULL, then Oracle Database uses the sequence generator to assign a value to the column when a subsequent INSERT statement attempts to assign a value that evaluates to NULL.

Các vấn đề liên quan