вставка данных в таблицы, где идентификаторы должны быть равны

#sql #oracle #sql-insert

#sql #Oracle #sql-вставка

Вопрос:

У меня есть две таблицы, customer и order, каждая с двумя записями на 2020 год. Отмеченные звездочками значения — это то, что я хочу добавить для 2021 финансового года.

Клиент:

ID FY Имя
1 2020 Тина Смит
2 2020 Бобби Браун
134 2021 Тина Смит***
234 2021 Бобби Браун***

Порядок

ID 2digitFY Еда Пить
1 20 Хот-дог Вода
2 20 Бургер Сода
134 21 Хот-дог Вода***
234 21 Бургер Сода ***

Я хочу добавить записи в обе таблицы, которые представляют собой одни и те же данные для 2020/20 финансового года, только новые порядковые номера с данными 2021/21 года, указанными выше. Я не могу понять, как я мог бы сделать новые идентификаторы равными при их автоматической генерации. Ниже приведен аналогичный код, который я настроил (поддельные данные, используемые выше).

 insert into customer (id, fy, name)
    select (id, '2021', name)
    from customer
    where fy = '2020'

insert into order (id, 2digitFY, food, drink)
    select (id, '21', food, drink)
    from order
    where 2digitFY = '20'
 

Ответ №1:

Я не могу понять, как я мог бы сделать новые идентификаторы равными при их автоматической генерации.

Если то, что вы сказали, означает, что эти столбцы являются первичными ключами, которые генерируются автоматически, то у вас нет контроля над этим, это делает Oracle.

Я полагаю, что «автогенерация», о которой вы сказали, означает столбец идентификаторов, значение которого генерируется автоматически. Если это так, измените его так, чтобы он использовал GENERATED BY DEFAULT ON NULL option . Это означает, что — если вы не укажете ID значение, Oracle сгенерирует его. Но, если вы предоставите его, его значение будет тем, которое вы вставили.

Аналогично, если вы используете 11g или ниже (где столбцы идентификаторов не существуют) и создали эти значения с помощью триггеров базы данных, убедитесь, что они запускают и заполняют ID столбцы только тогда, когда их значения равны NULL .

Если вы это сделаете, то сможете создавать свои собственные значения идентификаторов и вставлять их по своему усмотрению.

Комментарии:

1. я считаю, что мы генерируем его по умолчанию для null . как и при добавлении записи, БД присваивает ей любое значение next, которое не использовалось. Моя проблема в том, что я не могу понять, как сделать так, чтобы при вставке таблиц я хотел каким-то образом проверить соответствие записей между таблицами и иметь новые, но одинаковые идентификаторы в таблице при вставке. Я боюсь, что oracle просто присвоит им значения, которые не будут совпадать, и тогда мы не сможем выяснить, что с чем связано.

2. Как я уже сказал: если вы предоставите значения идентификаторов, Oracle не будет их генерировать. Итак, вычислите эти идентификаторы и вставьте строки, используя эти значения.