如何将“序列值”插入Number数据类型? -SQL [重复]

问题描述 投票:0回答:1

我正在尝试填写表格,并且我想在主键值(数字)上插入序列,所以我将确保不会重复。

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"
sql oracle
1个回答
0
投票

您的直接问题是,您已在要插入的字符串两边加上了双引号。因此,Oracle将它们视为列名而不是字符串。使用单引号代替:

INSERT INTO Student (Student_ID,First_Name,Last_Name) 
    VALUES (STUDENT_ID_SQ.NEXTVAL, 'Jhon','Smith');

Demo on DB Fiddle


而且,我建议不要创建一个触发器来处理该用例,而不是为每个插入命令调用序列的下一个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

Demo on DB Fiddle

© www.soinside.com 2019 - 2024. All rights reserved.