簡體   English   中英

SQL 服務器 / Oracle:從 select 語句為非標識列插入值(插入…值((選擇語句)、值 1、值 2、值 3)

[英]SQL Server / Oracle : insert value from a select statement for an non-identity column (Insert into…values((select statement), value1, value2, value3)

我想從 select 語句中插入 ( user_id ) 值,如下所示。 它有效,但user_id不會增加,因為user_id不是標識列。 我想在每次插入查詢運行時增加user_id計數。 現在它沒有發生。 我創建了一個數據庫小提琴。 我希望此代碼適用於 SQL 服務器和 Oracle 版本。

https://dbfiddle.uk/?rdbms=sqlserver_2019l&fiddle=ba954e4d37831a46aea3b3f3b499cc51

CREATE TABLE b_user (
  user_id      INT,
  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_id,
  user_name,
  user_email,
  user_address,
  user_city,
  user_state,
  user_country,
  user_zip
) values (
  1,
  'Alice',
  'alice@example.com',
  'A house',
  'A city',
  'STATE',
  'ABC',
  'ZZ0123'
);

insert into b_user (user_id,
                    user_name,
                    user_email,
                    user_address,
                    user_city,
                    user_state,
                    user_country,
                    user_zip)
values (
   (select max(user_id)  from b_user),
   'david brown',
   'david@david.com',
   'david''s house',
   'chicago',
   'il',
   'usa',
   60007
)

數據庫小提琴截圖

將列定義為identity列:

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中刪除它。 它會自動分配一個值。

編輯:

如果無法修改表,可以嘗試:

values (
   (select coalesce(max(user_id) + 1, 1)  from b_user),
   'david brown',
   'david@david.com',
   'david''s house',
   'chicago',
   'il',
   'usa',
   60007
)

這不是線程安全的,不推薦。 這就是identity列有用的原因。

您可以創建一個從最大 ID 開始的序列。 然后您可以為序列輕松增加 select 的下一個值。

編輯:如果您需要序列以表中的值開始,您可以包裝在此處描述的 exec 語句中

CREATE SEQUENCE IDSeq  
    START WITH 2  
    INCREMENT BY 1 ;  
GO

然后

values (
   (NEXT VALUE FOR IDSeq),
   'david brown',
   'david@david.com',
   'david''s house',
   'chicago',
   'il',
   'usa',
   60007
)

暫無
暫無

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

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