当前位置: 首页 > 知识库问答 >
问题:

使用选择插入多行到表中,但是表在oracleSQL中有primery键[重复]

方兴旺
2023-03-14

我在一次将多行插入表时面临问题,因为列id具有主键并基于序列创建。

对于ex:

create table test (
  iD number primary key,
  name varchar2(10)
);


insert into test values (123, 'xxx');
insert into test values (124, 'yyy');
insert into test values (125, 'xxx');
insert into test values (126, 'xxx');

以下语句创建约束违反错误:

insert into test
(
   select (SELECT MAX (id) + 1 FROM  test) as id,
   name from test
  where name='xxx'
 );

此查询应在表test中插入3行(名称为xxx)。

共有3个答案

荆煌
2023-03-14

如果要插入由序列生成的ID/主键值,则应使用该序列而不是选择max(ID)1。

通常这是使用表上的触发器完成的,并且为每一行执行。请参阅下面的示例:

CREATE TABLE "MY_TABLE" 
(   
  "MY_ID" NUMBER(10,0) CONSTRAINT PK_MY_TABLE PRIMARY KEY , 
  "MY_COLUMN" VARCHAR2(100)
);
/ 
CREATE SEQUENCE  "S_MY_TABLE" 
MINVALUE 1 MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 10 NOCACHE  ORDER  NOCYCLE  NOPARTITION ;
/
 CREATE OR REPLACE TRIGGER "T_MY_TABLE" 
  BEFORE INSERT
  ON
  MY_TABLE
  REFERENCING OLD AS OLDEST NEW AS NEWEST
  FOR EACH ROW
    WHEN (NEWEST.MY_ID IS NULL)
DECLARE
   IDNOW NUMBER;
  BEGIN
    SELECT  S_MY_TABLE.NEXTVAL INTO IDNOW FROM DUAL;
    :NEWEST.MY_ID := IDNOW;
  END;

/
ALTER TRIGGER "T_MY_TABLE" ENABLE;
/
insert into MY_TABLE (MY_COLUMN) values ('DATA1');
insert into MY_TABLE (MY_COLUMN) values ('DATA2');
insert into MY_TABLE (MY_ID, MY_COLUMN) values (S_MY_TABLE.NEXTVAL, 'DATA3');
insert into MY_TABLE (MY_ID, MY_COLUMN) values (S_MY_TABLE.NEXTVAL, 'DATA4');
insert into MY_TABLE (MY_COLUMN) values ('DATA5');
/
select * from MY_TABLE;
翁鸿远
2023-03-14

使用

insert into test (
   select (SELECT MAX (id) FROM  test) + rownum as id,
   name from test
  where name='xxx'
 );

作为解决方法

当然,您应该对整数主键使用序列。

孟嘉歆
2023-03-14

您是说您的查询根据序列插入具有主键ID的行。然而,在您的插入/选择中,有select(SELECT MAX(id)1 From test)作为id,这显然不是基于序列。可能是因为您没有以通常的Oracle方式使用术语“序列”。

无论如何,你有两个选择。。。

    但是,请注意,每当代码在多个并发数据库会话中运行时,选项2(以及您的原始解决方案)都会给您带来巨大的麻烦。因此,强烈建议选择1。

     类似资料:
    • 我正在尝试使用单个表将数据插入到不同的表中,并且我正在插入的表具有主键。

    • 我正在创建一个使用Apache Web服务器(PHPmyAdmin)的PHP网站 我有三张桌子: 品牌 brand_id(主键)自动增加 brand_name < li>item_id(主键)自动递增 < li >项目类别 model_id(主键)自动增加 item_model brand_id(brand.brand_id的外键) brand_name(item.item_id的外键) 数量 价

    • 问题内容: 我试图将数据从现有表之一插入到另一个现有表中。 是否可以使用 查询将数据插入到任何现有表中。我认为可以使用联合完成此操作,但在那种情况下,我需要将现有表的所有数据记录到临时表中,然后删除该表,最后再应用联合将所有记录插入同一表中 例如。 这里tblExisting是我实际上要存储所有数据的表tblActualData是要将数据附加到tblExisting的表。 是正确的方法。 我们还有

    • 问题内容: 我当前正在使用SQL Server 2008,并且正在尝试使用表变量创建语句以在表中插入多行。就目前而言,我必须将要添加的信息插入4个不同的位置(2个select语句,1个insert和1个update),但是希望能够创建一个表变量,因此我只需要输入信息一次。任何帮助/建议将不胜感激。 这是我试图改变的一个例子。 问题答案: 这是您仅要输入一次信息所要寻找的东西吗?

    • 问题内容: 我有这样构建的mysql表: 当我做: 我得到: 为每个唯一用户生成一个唯一的post_id。 我需要gen_id列为1 2 3 4 5 6等。执行插入操作时如何增加此列。我尝试了以下方法,但无法正常工作。什么是正确的方法? 问题答案: 试试这个:

    • 我有一个大约15万行的表,我必须使用JavaQuartz Scheduler一次获取1000行。要求是一次限制1000行,然后再限制1000行等(与MySQL限制查询相同)。 我正在使用以下查询: 问题是上面的查询返回了我在结果集中不需要的额外列rownum,因为返回的数据被传递给MapListHandler(),后者返回将结果转换为JSON,并且我将此JSON传递给不期望额外rownum列的We