【问题标题】:SQL AUTO_INCREMENT and INSERT MANY VALUES TO ONE ROWSQL AUTO_INCREMENT 并将许多值插入一行
【发布时间】:2020-03-29 19:25:47
【问题描述】:

我目前正在将数据从表中获取到另一个表中。但是,旧表有 3 行,我的新表有两个,但一个是 ID PK。所以我想从这 3 行中获取数据并将它们插入到PN 表中。这里的问题是PN_ID。我是新手,任何帮助都会很有用。以下是我当前的代码以及我尝试过的代码。

这是我要从中获取数据的表:

CREATE TABLE NAMES (
NAME_ID varchar(9),
NAME varchar(35),
PN1 varchar(255),
PN2 varchar(255),
PN3 varchar(30)
);

这也是插入数据的新表:

CREATE TABLE PN( 
PN_ID INT,
PN VARCHAR (30)
);


Insert into PN(PROFFESION_ID, PN)
Select  PN1 ||', '||PN2 ||', '||PN3 from NAMES;`

这里的问题是PN_ID,我想成为AUTO_INCREMENT,但我确实尝试了不同的方法,但它们都不起作用,例如:

CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10;

【问题讨论】:

  • 您忘记了... Select seq_person.nextval || ...seq_person.nextval 后面的逗号,还需要删除seq_person.nextval 后面的连接运算符。试试... SELECT seq_person.nextval, ', ' || ...
  • Insert into PROFFESION(PROFFESION_ID, PROFFESION) Select seq_person.nextval , PROFESSION1 from NAMES; 应该可以工作。
  • 谢谢你们帮助我

标签: oracle sql-insert


【解决方案1】:

这段代码确实有效:

insert into PROFFESION(PROFFESION_ID, PROFFESION)
select seq_person.nextval, ( PROFESSION1 ||', '||PROFESSION2 ||', '||PROFESSION3) 
from NAMES;

【讨论】:

    【解决方案2】:

    我觉得 PROFESSION 表的设计不正确。它应该有一个指向 NAMES 表的外键;然后,根据需要添加尽可能多的单独 PROFESSION 行,以在当前 NAMES 表中存储所有非 NULL PROFESSIONn 字段。然后,删除 NAMES.PROFESSIONn 列。换句话说:

    CREATE TABLE PROFESSION
     (PROFESSION_ID INT NOT NULL PRIMARY KEY,
      NAME_ID       VARCHAR(9)
        CONSTRAINT PROFESSION_FK1
          REFERENCES NAMES(NAME_ID)
            ON DELETE CASCADE,
      PROFESSION VARCHAR(30));
    
    CREATE SEQUENCE PROFESSION_SEQ
      MINVALUE 1
      NOMAXVALUE
      INCREMENT BY 1
      NOCACHE;
    
    INSERT INTO PROFESSION(PROFESSION_ID, NAME_ID, PROFESSION)
      SELECT PROFESSION_SEQ.NEXT_VAL, NAME_ID, PROFESSION1 FROM NAMES UNION ALL
      SELECT PROFESSION_SEQ.NEXT_VAL, NAME_ID, PROFESSION2 FROM NAMES UNION ALL
      SELECT PROFESSION_SEQ.NEXT_VAL, NAME_ID, PROFESSION3 FROM NAMES;
    
    ALTER TABLE NAMES
      DROP COLUMN PROFFESION1;
    
    ALTER TABLE NAMES
      DROP COLUMN PROFFESION2;
    
    ALTER TABLE NAMES
      DROP COLUMN PROFFESION3;
    

    我还修正了“专业”的拼写,所以它在任何地方都是一致的。

    db<>fiddle here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2012-10-08
      相关资源
      最近更新 更多