[英]SQL(SQL/Oracle) insert value from a select statement using sequence
我想从如下所示的 select 语句中插入 (user_id) 值,而没有标识列。 目前这个查询没有按顺序跟随序列号。 好心提醒。
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=195728e48cc8a5a0047fec8837e9f217
这是回答问题的原始版本。
如果您问是否可以使用相同的 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 中, 您不能在用户定义的函数中使用序列,因此无法复制 Oracle 中的方法。
因此,简而言之,如果您使用序列,您将不得不对不同的数据库使用不同的 SQL 语句。
如果要使用IDENTITY
列,则可以在两者中获得相同的语法。
在甲骨文中:
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_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)
)
然后,在两个数据库中,您都可以使用以下语句:
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'
);
一种选择是,如果您知道列 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 ;
最好在该列中有一个主键或唯一约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.