繁体   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