我不能使用全部插入功能将值插入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')
答案 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');