我是大学生,需要使用Oracle的iSQL * Plus提交课程。
我正在尝试使用以下SQL语句创建一个表:
CREATE TABLE Category
( `id` INT(11) NOT NULL AUTO_INCREMENT ,
`title` VARCHAR (45) NULL ,
PRIMARY KEY (`id`) );
这会产生以下消息:
ORA-00911:无效字符
它指的是勾号。所以我尝试使用单引号代替以下内容:
CREATE TABLE Category
( 'id' INT(11) NOT NULL AUTO_INCREMENT ,
'title' VARCHAR (45) NULL ,
PRIMARY KEY ('id') );
错误:
ORA-00904 ::无效标识符
再试一次“ - 错误:
( "id" INT(11) NOT NULL AUTO_INCREMENT ,
*
ORA-00907:缺少右括号
如果我删除了INT背后的(11)
,它会投诉AUTO_INCREMENT
属性。
CREATE TABLE Category
( "id" INT NOT NULL AUTO_INCREMENT ,
"title" VARCHAR (45) NULL ,
PRIMARY KEY ("id") );
我认为SQL是SQL,并且在这些基本级别上没有真正的差异。我认为事情在更深层次上会有所不同?
答案 0 :(得分:14)
并非所有SQL都相同。 Oracle和MySQL都不支持IDENTITY的实际SQL标准。
Oracle不使用反引号...您实际上不需要引用您的标识符。最好不要这么做,不要无意中在标识符中使用无效字符。
Oracle数字称为NUMBER,可以采用可选的精度和比例。
CREATE TABLE Category
(
id NUMBER(11) NOT NULL,
title VARCHAR2(45) NULL,
PRIMARY KEY (id)
)
要执行AUTO_INCREMENT,请创建序列:
CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;
然后当您插入表格时,请执行以下操作:
INSERT INTO category
VALUES (seq_category_id.nextval, 'some title');
要自动执行此操作,例如AUTO_INCREMENT,请使用before insert trigger:
-- Automatically create the incremented ID for every row:
CREATE OR REPLACE trigger bi_category_id
BEFORE INSERT ON category
FOR EACH ROW
BEGIN
SELECT seq_category_id.nextval INTO :new.id FROM dual;
END;
或者:
-- Allow the user to pass in an ID to be used instead
CREATE OR REPLACE TRIGGER bi_category_id
BEFORE INSERT ON category
FOR EACH ROW
DECLARE
v_max_cur_id NUMBER;
v_current_seq NUMBER;
BEGIN
IF :new.id IS NULL THEN
SELECT seq_category_id.nextval INTO :new.id FROM dual;
ELSE
SELECT greatest(nvl(max(id),0), :new.id) INTO v_max_cur_id FROM category;
SELECT seq_category_id.nextval INTO v_current_seq FROM dual;
WHILE v_current_seq < v_max_cur_id
LOOP
SELECT seq_category_id.nextval INTO v_current_seq FROM dual;
END LOOP;
END IF;
END;
现在,就发现这些差异而言,您通常可以搜索“oracle identity”或“oracle auto_increment”之类的内容,以了解Oracle如何做到这一点。
答案 1 :(得分:4)
Oracle没有自动增量列。您需要创建一个sequence
和before insert
触发器,从序列中读取NEXTVAL
并设置列的值