簡體   English   中英

SQL(SQL/Oracle) 使用序列從選擇語句插入值

[英]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'
);

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 ;

最好在該列中有一個主鍵或唯一約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM