加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

自动增量列:Oracle和MySQL之间SQL语法的差异

发布时间:2020-12-12 13:13:19 所属栏目:百科 来源:网络整理
导读:我是大学生,需要使用Oracle的iSQL * Plus提交课程. 我正在尝试使用以下SQL语句创建一个表: CREATE TABLE Category ( `id` INT(11) NOT NULL AUTO_INCREMENT,`title` VARCHAR (45) NULL,PRIMARY KEY (`id`) ); 这会产生以下消息: ORA-00911: invalid charac
我是大学生,需要使用Oracle的iSQL * Plus提交课程.

我正在尝试使用以下SQL语句创建一个表:

CREATE  TABLE  Category 
( `id` INT(11) NOT NULL AUTO_INCREMENT,`title` VARCHAR (45) NULL,PRIMARY KEY (`id`) );

这会产生以下消息:

ORA-00911: invalid character

它指的是勾号.所以我尝试了以下内容,使用单引号代替:

CREATE  TABLE  Category 
( 'id' INT(11) NOT NULL AUTO_INCREMENT,'title' VARCHAR (45) NULL,PRIMARY KEY ('id') );

错误:

ORA-00904: : invalid identifier

所以再试一次“ – 错误:

( "id" INT(11) NOT NULL AUTO_INCREMENT,*

ORA-00907: missing right parenthesis

如果我删除INT后面的(11),它将抱怨AUTO_INCREMENT属性.

CREATE  TABLE  Category 
( "id" INT NOT NULL AUTO_INCREMENT,"title" VARCHAR (45) NULL,PRIMARY KEY ("id") );

我认为SQL是SQL,并且在这些非常基本的级别上没有真正的差异.我认为事情在更深层次上变得不同了?

>我如何让我的陈述有效?
>对于熟悉MySQL学习Oracle的人,你会推荐什么?

解决方法

并非所有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触发器:

-- 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如何执行此操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读