Как скопировать данные из одной таблицы в другую, а затем из второй таблицы обратно в первую?

Как написать запрос INSERT INTO, чтобы загрузить айдишники serial из каждой таблицы в другую таблицу? Требуется создать и заполнить таблицы на основе существующих данных, включая использование внешних ключей.
  • 20 января 2024 г. 12:58
Ответы на вопрос 3
Чтобы скопировать данные из одной таблицы в другую в SQL, и затем обратно, можно использовать запросы `INSERT INTO ... SELECT`. Для начала убедитесь, что структуры таблиц согласованы так, чтобы данные могли быть скопированы. 

Допустим, у нас есть две таблицы `table1` и `table2`, и вы хотите скопировать значения столбца `serial` из `table1` в `table2`, а затем обратно:

```sql
-- Копирование из table1 в table2
INSERT INTO table2 (serial)
SELECT serial FROM table1;

-- Копирование из table2 в table1
INSERT INTO table1 (serial)
SELECT serial FROM table2;
```

Обратите внимание, что это работает для копирования данных из одной таблицы в другую, для которой столбцы совместимы. Однако, если вы хотите вставить данные, используя внешние ключи, работа усложняется, потому что внешние ключи требуют соблюдения ссылочной целостности.

Чтобы рассмотреть данный случай более подробно, понадобятся более конкретные детали о структуре таблиц. Вот пример с внешними ключами:

Предположим, у нас есть таблицы `parent` и `child`, и каждый `child` должен иметь существующий `parent_id`:

```sql
CREATE TABLE parent (
    parent_id INT PRIMARY KEY,
    data      VARCHAR(255)
);

CREATE TABLE child (
    child_id   INT PRIMARY KEY,
    parent_id  INT,
    child_data VARCHAR(255),
    FOREIGN KEY (parent_id) REFERENCES parent(parent_id)
);
```

Копирование данных из `parent` в `child`, предполагая, что в `child` уже есть соответствующие `child_id` значения и нужно обновить только `parent_id`:

```sql
INSERT INTO child (child_id, parent_id)
SELECT child_id, parent_id
FROM parent
WHERE ...
```

Если же `child_id` не существует, вы должны его сначала создать. Пример, когда `child_data` применяется как новая запись:

```sql
INSERT INTO child (parent_id, child_data)
SELECT parent_id, 'Some data'
FROM parent
WHERE ...
```

Для копирования обратно, например, обновление данных в `parent` на основе данных из `child`, вам может понадобиться запрос `UPDATE` вместо `INSERT`. Пример обновления `data` в `parent`:

```sql
UPDATE parent
SET data = (SELECT child_data FROM child WHERE child.parent_id = parent.parent_id)
WHERE EXISTS (SELECT 1 FROM child WHERE child.parent_id = parent.parent_id);
```

Важно помнить, что запросы, использующие внешние ключи, должны соответствовать ограничениям ссылочной целостности, и данные должны быть согласованы так, чтобы внешние ключи всегда указывали на существующие записи.
ошибка в проектирование, достаточно ссылки regions в capitals, либо оборот capitals в regions, но уникальной, т.е связь 1-к-1
Создаёте запись в первой таблице без указания связи, получая ID созданной записи через  RETURNING. Создаёте запись во второй таблице, указывая связь с первой и получая ID созданной записи через  RETURNING. Меняете запись в первой таблице, прописывая ID связанной записи из второй таблицы. 
Но, по большому счёту, одна из ссылок лишняя. Она ничего не даёт, только добавляет необходимость дополнительного контроля, чтобы не оказалось, что столица Китая - Пекин, но Пекин - столица США.
Похожие вопросы