SQLSQL / Oracle使用序列从select语句插入值

问题描述

我想从如下所示的select语句中插入(user_id)值,而无需标识列。当前,此查询未按顺序跟随序列号。请告知。

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=195728e48cc8a5a0047fec8837e9f217

解决方法

这是回答问题的original version

如果您询问是否可以使用相同的SQL语句在SQL Server和Oracle中使用序列,那么不可以。

在Oracle中,语法为:

INSERT INTO b_user ( user_id /*,... */ )
  VALUES ( b_user__user_id__seq.NEXT_VAL /*,... */ );

在SQL Server中,语法为:

INSERT INTO b_user ( user_id /*,... */ )
  VALUES ( NEXT VALUE FOR b_user__user_id__seq /*,... */ );

在Oracle中,您可以将对序列的调用包装在一个函数中:

CREATE FUNCTION get_next_b_user_id RETURN INT
IS
BEGIN
  RETURN b_user__user_id__seq.NEXTVAL;
END;
/

然后您可以使用:

INSERT INTO b_user ( user_id /*,... */ )
  VALUES ( get_next_b_user__id__seq() /*,... */ );

但是,在SQL Server you cannot use a sequence in user-defined functions中,这样就无法复制Oracle中的方法。


因此,简而言之,如果要使用序列,则必须对不同的数据库使用不同的SQL语句。

如果您想使用IDENTITY列,则可以在两者中获得相同的语法。

在Oracle中:

CREATE TABLE b_user (
  user_id      INT
               GENERATED ALWAYS AS IDENTITY,user_name    VARCHAR(250),user_email   VARCHAR(250),user_address VARCHAR(250),user_city    VARCHAR(50),user_state   VARCHAR(5),user_country VARCHAR(5),user_zip     VARCHAR(10)
);

以及在SQL Server中:

CREATE TABLE b_user (
  user_id      INT IDENTITY(1,1),user_zip     VARCHAR(10)
)

然后,在两个数据库中,您都可以使用以下语句:

insert into b_user (
  user_name,user_email,user_address,user_city,user_state,user_country,user_zip
) values (
  'Alice','alice@example.com','A house','A city','STATE','ABC','ZZ0123'
);

Oracle db<>fiddleSQL Server db<>fiddle

,

一个选项是,如果您知道列user_id已经插入了一些值,那么当您创建要用于该列的序列时

--example you start with 3 if you know 2 is the maximum value for that column.
CREATE SEQUENCE b_user__user_id__seq  start with 3 ;

在该列中最好具有主键或唯一约束。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...