此问题已经在这里有了答案:
我正在尝试填写表格,并且我想在主键值(数字)上插入序列,所以我将确保不会重复。
CREATE TABLE Student (
Student_ID number(3) CONSTRAINT Student_ID_pk PRIMARY KEY,
First_Name VARCHAR2(14) CONSTRAINT First_name_NN NOT NULL,
Last_Name VARCHAR(14) CONSTRAINT Last_name_NN NOT NULL
);
CREATE SEQUENCE STUDENT_ID_SQ
INCREMENT BY 111
START WITH 111
NOMAXVALUE
NOCYCLE;
INSERT INTO Student (Student_ID,First_Name,Last_Name)
VALUES (STUDENT_ID_SQ.NEXTVAL, "Jhon","Smith");
错误:
Error starting at line : 14 in command -
INSERT INTO Student (Student_ID,First_Name,Last_Name)
VALUES (STUDENT_ID_SQ.NEXTVAL, "Jhon","Smith")
Error at Command Line : 15 Column : 47
Error report -
SQL Error: ORA-00984: column not allowed here
00984. 00000 - "column not allowed here"
您的直接问题是,您已在要插入的字符串两边加上了双引号。因此,Oracle将它们视为列名而不是字符串。使用单引号代替:
INSERT INTO Student (Student_ID,First_Name,Last_Name)
VALUES (STUDENT_ID_SQ.NEXTVAL, 'Jhon','Smith');
而且,我建议不要创建一个触发器来处理该用例,而不是为每个插入命令调用序列的下一个val:
CREATE OR REPLACE TRIGGER TRG_STUDENT_ID
BEFORE INSERT ON STUDENT
FOR EACH ROW
BEGIN
IF :NEW.STUDENT_ID IS NULL THEN
SELECT STUDENT_ID_SQ.NEXTVAL INTO :NEW.STUDENT_ID FROM DUAL;
END IF;
END;
/
然后您可以简单地做:
INSERT INTO Student (First_Name,Last_Name) VALUES ('John','Smith');
触发器将自动调用序列并将其下一个值分配给Student_ID
。