SQL AUTO_INCREMENT и ВСТАВЬТЕ МНОГО ЗНАЧЕНИЙ В ОДИН СТРОК - PullRequest
0 голосов
/ 29 марта 2020

В настоящее время я работаю, чтобы получить данные из таблицы в другую. Тем не менее, старая таблица имеет 3 строки, а моя новая таблица имеет две, но одна из них - идентификатор 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;

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Этот код работал:

insert into PROFFESION(PROFFESION_ID, PROFFESION)
select seq_person.nextval, ( PROFESSION1 ||', '||PROFESSION2 ||', '||PROFESSION3) 
from NAMES;
0 голосов
/ 29 марта 2020

Похоже, дизайн таблицы PROFESSION неверен. Должен иметь внешний ключ к таблице NAMES; затем добавьте столько отдельных строк PROFESSION, сколько необходимо для хранения всех не-NULL PROFESSIONn полей в вашей текущей таблице NAMES. ТО, отбросьте столбцы 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 <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...