Вставить новую запись в таблицы, связанные с существующими (ключ и внешний ключ)

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

У меня в таблице 1:

╔════════════════╦═══════╦═══════╦═══════╗
║ id_colum (key) ║ desc1 ║ desc2 ║ desc3 ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAA           ║ x     ║ x     ║ x     ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAB           ║ x     ║ x     ║ x     ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAC           ║ x     ║ x     ║ x     ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAD           ║ x     ║ x     ║ x     ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAE           ║ x     ║ x     ║ X     ║
╚════════════════╩═══════╩═══════╩═══════╝

и в таблице 2

╔════════════════════════╦════╦═══════╦═══════╦═══════╗
║ id_colum (foreign key) ║ id ║ desc1 ║ desc2 ║ desc3 ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAA                   ║ 1  ║ x     ║ x     ║ x     ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAA                   ║ 2  ║ x     ║ x     ║ x     ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAC                   ║ 3  ║ x     ║ x     ║ x     ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAC                   ║ 4  ║ x     ║ x     ║ x     ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAC                   ║ 5  ║ x     ║ x     ║ X     ║
╚════════════════════════╩════╩═══════╩═══════╩═══════╝

и у меня есть записи в обеих таблицах (50 таблица 1 и 200 таблица 2, чтобы дать представление об отношении), теперь у меня есть подгруппа этих записей, которую мне нужно вставить в обе таблицы, поэтому у меня есть таблица 1, которая сгенерирует ключи, и мне нужно добавить еще и в таблицу 2, но с использованием id_colum, который придет после добавления в таблицу1. Я пробую разные комбинации, но не получаю нужного результата. Я попытался объединить обе таблицы

SELECT *
FROM table1 t1
     LEFT JOIN table2 t2 ON t1.id_colum = t2.id_colum
WHERE t1.id_colum IN('AAAA', 'AAAB', 'AAAC');

но тогда я застрял на том, как вставка будет работать для него

(Короче говоря, мне нужно вставить новые значения в таблицы на основе значений, которые у меня есть, но с сохранением ключевого отношения)

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
239
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Можешь попробовать:

ВСТАВИТЬ В таблицу2 (id_colum, desc1, desc2, desc3) ВЫБРАТЬ id_colum, desc1, desc2, desc3 ИЗ таблицы1

Я не понимаю, как это будет работать, ключ генерируется при вставке в таблицу1, в вашем запросе нет вставки в эту таблицу

Baldie47 10.12.2020 18:10

@ Baldie47 Вы имели в виду вот это? code ВСТАВИТЬ В таблицу1 (id_colum, desc1, desc2, desc3) ВСТАВИТЬ В таблицу2 (id_colum, desc1, desc2, desc3) ВЫБРАТЬ id_colum, desc1, desc2, desc3 ИЗ таблицы1 code

Mark 10.12.2020 18:27

нет, значения для id_colum в таблице 1 генерируются автоматически при выполнении вставки, мне нужно выполнить вставку в эту таблицу и использовать ключи, сгенерированные как столбцы в таблице 2 на основе вашего запроса, который я могу сделать: INSERT INTO table1 ( desc1, desc2, desc3) INSERT INTO table2(id_colum (сгенерированный после вставки таблицы 1), desc1, desc2, desc3) SELECT id_colum,desc1, desc2, desc3 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id_colum = t2.id_colum ГДЕ t1.id_colum IN('АААА', 'АААВ', 'АААС'); вы понимаете, что я имею в виду?

Baldie47 10.12.2020 18:35

Пример: вставить таблицу1: ВСТАВИТЬ В таблицу1(описание1,описание2,описание3) ЗНАЧЕНИЯ('x','x','x') ВСТАВИТЬ В таблицу1(описание1,описание2,описание3) ЗНАЧЕНИЯ('x','x',' x') INSERT INTO table1( desc1, desc2, desc3) VALUES ('x','x','x') После вставки table2 INSERT INTO table2(id_colum, desc1, desc2, desc3) SELECT t1.id_colum, t1.desc1 , t1.desc2, t1.desc3 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id_colum = t2.id_colum WHERE t1.id_colum IN(1, 3); Может быть, я не понимаю, что вы имеете в виду. Ха-ха :D

Mark 10.12.2020 18:54

Это зависит от того, какая структура базы данных у вас уже есть. Если вы используете SEQUENCE вместо PRIMARY KEY, то это очень легко сделать.

Допустим, у вас есть такая структура:

CREATE SEQUENCE dbo.seq_cityId START WITH 1;

CREATE TABLE City
(
    CityId INT PRIMARY KEY DEFAULT (NEXT VALUE FOR dbo.seq_cityId),
    CityName NVARCHAR(50) NOT NULL
);

CREATE TABLE CityDetails
(
    CityId INT PRIMARY KEY REFERENCES City (CityId),
    LatestRecordedPopulation BIGINT
);

Затем, если вы хотите заполнить эти таблицы вместе, вы можете создать временную промежуточную таблицу, например:

SELECT NEXT VALUE FOR dbo.seq_cityId as CityId, *
INTO #StagingTable
FROM (VALUES ('San Francisco', 805235),
             ('Buffalo', 261310),
             ('Seattle', 608660)) R (CityName, Population);

INSERT INTO City
SELECT CityId, CityName
FROM #StagingTable

INSERT INTO CityDetails
SELECT CityId, Population
FROM #StagingTable

Если вы используете IDENTITY, это означает вместо:

CityId INT PRIMARY KEY DEFAULT (NEXT VALUE FOR dbo.seq_cityId)

в вашей структуре таблицы City у вас есть:

CityId INT IDENTITY(1,1) PRIMARY KEY

Тогда решение немного сложное:

SELECT *
INTO #StagingTable
FROM (VALUES ('San Francisco', 805235),
             ('Buffalo', 261310),
             ('Seattle', 608660)) R (CityName, Population);

DECLARE @OutputCities TABLE (CityId INT, CityName NVARCHAR(MAX));

INSERT INTO City
OUTPUT inserted.CityId, inserted.CityName INTO @OutputCities
SELECT CityName
FROM #StagingTable

INSERT INTO CityDetails
SELECT CityId, Population
FROM @OutputCities OC
     JOIN #StagingTable ST ON ST.CityName = OC.CityName

Поскольку вы вставляете более одной записи, вы не можете использовать SCOPE_IDENTITY(), и тогда лучший вариант — использовать таблицу перекрестных ссылок для таких вещей, как #StagingTable и @OutputCities в этом примере. Во втором примере столбец IDENTITY с именем CityName является уникальным идентификатором, поэтому для этих решений всегда нужно находить уникальный идентификатор.

Другие вопросы по теме