【问题标题】:Insert in table, Sequence.nextval not working插入表格,Sequence.nextval 不起作用
【发布时间】:2013-11-21 10:58:41
【问题描述】:

我有以下3张表,

Data_Excel 包含人的姓名、地址、城市和来源;
Person表有名字和ID;
我需要在 person_location 中插入地址来源、地址、城市和 ID...

我正在使用以下查询:

CREATE SEQUENCE seq
START WITH 6571
MINVALUE 6571
INCREMENT BY 1
CACHE 100

 

INSERT INTO Person (id,Name,source) 
Select (seq.nextval),p_name,source 
FROM Data_Excel 
WHERE P_Name NOT IN 
(SELECT name FROM Person) 
GROUP BY P_Name,P_Address,P_city,Source 
HAVING count(*) < 2;

但我收到以下错误。 我使用 seq 因为 ID 是 people 的主键,但它不是自动递增的。我也试过了,但有一个错误:

02287. 00000 -  "sequence number not allowed here" 
*Cause:    The specified sequence umber (CURRVAL or NEXTVAL) is inappropriate 
here in the statement. 
*Action:    emove the sequence number. 

【问题讨论】:

    标签: sql oracle11g oracle-sqldeveloper sql-insert


    【解决方案1】:

    尝试将序列移出分组查询:

    INSERT INTO Person (id,Name,source) 
    SELECT seq.nextval, p_name,source FROM (
    Select p_name,source 
    FROM Data_Excel 
    WHERE P_Name NOT IN 
    (SELECT name FROM Person) 
    GROUP BY P_Name,P_Address,P_city,Source 
    HAVING count(*) < 2
    );
    

    【讨论】:

    • 它有效 谢谢,如果我必须像每当我要插入一个值时一般都这样做,我会从 person 表中像 max(id)+1 那样做,我该怎么做?跨度>
    • 类似这样的东西:CREATE SEQUENCE seq START WITH (select max(id)+1 from person) MINVALUE (select max(id)+1 from person) INCREMENT BY 1 CACHE 100
    • 我猜(因为我这里没有要检查的 Oracle),而不是 SELECT seq.nextval, p_name,source FROM,您可以使用 SELECT ROWNUM + (SELECT MAX(id) FROM Person), p_name,source FROM。如果它有效(尝试一下),则警告它被认为是不好的做法,因为:当多个客户端同时执行时,语句可能会得到相同的 MAX(id) 并产生重复键,从而导致重复键错误。
    • 我在 select 语句中尝试过,但它只返回一次,例如结果中所有 3000 行的 6572,我如何确保该查询对每一行都运行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多