我是大学生,需要使用Oracle的isql * Plus提交课程.
@H_404_7@
@H_404_7@我正在尝试使用以下sql语句创建一个表:
@H_404_7@
>对于熟悉MysqL学习Oracle的人,你会推荐什么?
CREATE TABLE Category ( `id` INT(11) NOT NULL AUTO_INCREMENT,`title` VARCHAR (45) NULL,PRIMARY KEY (`id`) );@H_404_7@这会产生以下消息: @H_404_7@
@H_404_7@ORA-00911: invalid character@H_404_7@它指的是勾号.所以我尝试了以下内容,使用单引号代替: @H_404_7@
CREATE TABLE Category ( 'id' INT(11) NOT NULL AUTO_INCREMENT,'title' VARCHAR (45) NULL,PRIMARY KEY ('id') );@H_404_7@错误: @H_404_7@
@H_404_7@ORA-00904: : invalid identifier@H_404_7@所以再试一次“ – 错误: @H_404_7@
( "id" INT(11) NOT NULL AUTO_INCREMENT,*
@H_404_7@ORA-00907: missing right parenthesis@H_404_7@如果我删除INT后面的(11),它将抱怨AUTO_INCREMENT属性. @H_404_7@
CREATE TABLE Category ( "id" INT NOT NULL AUTO_INCREMENT,"title" VARCHAR (45) NULL,PRIMARY KEY ("id") );@H_404_7@我认为sql是sql,并且在这些非常基本的级别上没有真正的差异.我认为事情在更深层次上变得不同了? @H_404_7@>我如何让我的陈述有效?
>对于熟悉MysqL学习Oracle的人,你会推荐什么?
解决方法
并非所有sql都是相同的. Oracle和MysqL都不支持IDENTITY的实际sql标准.
@H_404_7@
@H_404_7@Oracle不使用反引号…您实际上不需要引用您的标识符.最好不要这样,你最终无意中在标识符中使用了无效字符.
@H_404_7@Oracle数字称为NUMBER,可以采用可选的精度和比例.
@H_404_7@
CREATE TABLE Category ( id NUMBER(11) NOT NULL,title VARCHAR2(45) NULL,PRIMARY KEY (id) )@H_404_7@要执行AUTO_INCREMENT,请创建一个序列: @H_404_7@
CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;@H_404_7@然后当您插入表格时,执行以下操作: @H_404_7@
INSERT INTO category VALUES (seq_category_id.nextval,'some title');@H_404_7@要自动执行此操作,例如AUTO_INCREMENT,请使用before insert触发器: @H_404_7@
-- 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;@H_404_7@要么: @H_404_7@
-- 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;@H_404_7@现在,就发现这些差异而言,您通常可以搜索“oracle identity”或“oracle auto_increment”之类的内容,以了解Oracle如何执行此操作.