我不能使用“全部插入”将值插入表中

时间:2019-10-07 07:09:15

标签: sql oracle insert

我不能使用全部插入功能将值插入first_name,last_name和phone列。

CREATE TABLE accounts (
    account_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
    first_name VARCHAR2(25) NOT NULL,
    last_name VARCHAR2(25) NOT NULL,
    email VARCHAR2(100),
    phone VARCHAR2(12) ,
    full_name VARCHAR2(51) GENERATED ALWAYS AS( 
            first_name || ' ' || last_name
    ),
    PRIMARY KEY(account_id)
);

INSERT ALL
INTO accounts(first_name,last_name,phone)VALUES('John','Mobsey','410-555-0197')
INTO accounts(first_name,last_name,phone)VALUES('Ted','Scherbats','410-555-0198')
INTO accounts(first_name,last_name,phone)VALUES('Leeanna','Bowman','410-555-0199')
SELECT* FROM DUAL;

这是我尝试运行代码时收到的错误消息:

  

ORA-00001:违反了唯一约束(BTMDATABASE.SYS_C0086595925)   ORA-06512:位于“ SYS.DBMS_SQL”的第1721行

1. INSERT ALL
2. INTO accounts(first_name,last_name,phone)VALUES('Trinity','Knox','410-555-0197')
3. INTO accounts(first_name,last_name,phone)VALUES('Mellissa','Porter','410-555-0198')

3 个答案:

答案 0 :(得分:2)

确实,您不能。您决定为account_id列创建唯一值的方式在insert all中不起作用,因为所有行都获得相同的值,这违反了主键约束。

两种解决方法:

  • 不要使用insert all而是使用单独的insert语句
  • 切换到序列以设置主键列的值

这是一个示例(如果需要):

SQL> create table accounts
  2    (account_id number primary key,
  3     first_name varchar2(20) not null
  4    );

Table created.

SQL> create sequence seq_acc;

Sequence created.

SQL> create or replace trigger trg_acc_seq
  2    before insert on accounts
  3    for each row
  4  begin
  5    :new.account_id := seq_acc.nextval;
  6  end;
  7  /

Trigger created.

SQL> insert all
  2    into accounts (first_name) values ('John')
  3    into accounts (first_name) values ('Ted')
  4    into accounts (first_name) values ('Leeanna')
  5  select * from dual;

3 rows created.

SQL> select * from accounts;

ACCOUNT_ID FIRST_NAME
---------- --------------------
         1 John
         2 Ted
         3 Leeanna

SQL>

答案 1 :(得分:1)

您的声明:

INSERT ALL
INTO accounts(first_name,last_name,phone)VALUES('John','Mobsey','410-555-0197')
INTO accounts(first_name,last_name,phone)VALUES('Ted','Scherbats','410-555-0198')
INTO accounts(first_name,last_name,phone)VALUES('Leeanna','Bowman','410-555-0199')
SELECT* FROM DUAL;

将尝试为所有行赋予相同的account_id,这将违反您的主键。

相反,您可以使用单独的INSERT语句;或者,如果您只需要一个语句/事务,则可以将INSERT语句包装在一个匿名PL / SQL块中:

BEGIN
  INSERT INTO accounts(first_name,last_name,phone)VALUES('John','Mobsey','410-555-0197');
  INSERT INTO accounts(first_name,last_name,phone)VALUES('Ted','Scherbats','410-555-0198');
  INSERT INTO accounts(first_name,last_name,phone)VALUES('Leeanna','Bowman','410-555-0199');
END;
/

或者,您也可以使用INSERT INTO ... SELECT ... UNION ALL ...

INSERT INTO accounts(first_name,last_name,phone)
  SELECT 'Trinity', 'Knox',  '410-555-0197' FROM DUAL UNION ALL
  SELECT 'Mellissa','Porter','410-555-0198' FROM DUAL;

输出

SELECT * FROM accounts;
ACCOUNT_ID | FIRST_NAME | LAST_NAME | EMAIL | PHONE        | FULL_NAME      
---------: | :--------- | :-------- | :---- | :----------- | :--------------
         2 | John       | Mobsey    | null  | 410-555-0197 | John Mobsey    
         3 | Ted        | Scherbats | null  | 410-555-0198 | Ted Scherbats  
         4 | Leeanna    | Bowman    | null  | 410-555-0199 | Leeanna Bowman 
         5 | Trinity    | Knox      | null  | 410-555-0197 | Trinity Knox   
         6 | Mellissa   | Porter    | null  | 410-555-0198 | Mellissa Porter

注意:1中的account_id是失败的INSERT ALL

db <>提琴here

答案 2 :(得分:0)

INSERT INTO accounts(first_name,last_name,phone)VALUES('John','Mobsey','410-555-0197');
INSERT INTO accounts(first_name,last_name,phone)VALUES('Ted','Scherbats','410-555-0198');
INSERT INTO accounts(first_name,last_name,phone)VALUES('Leeanna','Bowman','410-555-0199');