mysql - 自增列 : differences in SQL syntax between Oracle and MySQL

标签 mysql oracle

我是一名大学生,需要使用 Oracle 的 iSQL* Plus 提交类(class)作业。

我正在尝试使用以下 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,请使用插入前触发器:

-- 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 是如何做到这一点的。

关于mysql - 自增列 : differences in SQL syntax between Oracle and MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8116209/

相关文章:

php - mysql下发一个 'Can' t初始化字符集utf-8(路径:/usr/share/mysql/charsets/)' error,那里没有utf8.xml文件

php - 显示赞助商服务器不同的颜色不显示 php

sql - 在 Oracle 中哪里可以找到表的段?

sql - 一个命令可以执行多个控制文件吗?

mysql - 偏移量问题

php - 对 MySql 数据库关系实现企业约束

Mysql存储过程

sql - 将不在聚合函数中的列保留在 group by 语句中

java - 如何在 Oracle AQ 中停止在未经确认的情况下删除消息?

sql - 从 TSQL 到 PL/SQL 的迁移工具?