Вставить строку в таблицу для каждого идентификатора в другой таблице - PullRequest
40 голосов
/ 14 января 2009

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

У меня есть таблица с 17 миллионами + строк, каждый из которых имеет уникальный идентификатор. Недавно мы создали новую таблицу, которая будет использоваться вместе с предыдущей таблицей, где внешний ключ новой таблицы - это уникальный идентификатор старой таблицы.

Например.
Таблица 1 - идентификатор, поле1, поле2, поле3 ... таблица 2 - table1.id, field1 ...

Проблема в том, что, поскольку мы переносим это в живую среду, нам нужно заполнить таблицу 2 строкой, содержащей идентификатор из таблицы 1 для каждой строки в таблице 1. пример, таблица 1 - 1, тест, ноль Таблица 2 теперь должна иметь: 1, ноль, ... и так далее для каждой строки в таблице table1. Основная проблема заключается в том, что идентификаторы не все последовательны в таблице 1, поэтому нам придется читать из таблицы 1, а затем вставлять на основе идентификатора, найденного в таблице 2.

Есть ли более простой способ сделать это? заранее спасибо Джо

Также, чтобы уточнить, в таблице 2 будут новые данные, и единственное, что она будет содержать в таблице 1, это идентификатор для сохранения отношения внешнего ключа

Также это sql server 2000

Ответы [ 4 ]

46 голосов
/ 14 января 2009

Если я правильно понимаю, вы хотите одну запись в таблице 2 для каждой записи в таблице 1. Также я считаю, что помимо ссылки на table1, table2 должен изначально содержать пустые строки.

Так предполагая

table1 (ID, field1, field2, ...)
table2 (ID, table1_ID, fieldA, fieldB,...)
-- where table1_ID is a reference to ID of table1

После создания table2 вы можете просто запустить этот оператор вставки

insert into table2(table1_ID) 
select ID from table1
13 голосов
/ 14 января 2009

Я не уверен, что точно слежу за тобой, но подойдет ли тебе что-нибудь подобное?

INSERT INTO table2 ( SELECT field1, field2, field3... FROM table1 )

Если я правильно понимаю, вам нужна запись в таблице 2 для каждой записи в таблице 1. Это сделает именно это. Просто сопоставьте свои поля в порядке выбора в правильном порядке и укажите константы для любых полей в таблице2, которых нет в таблице 1.

НТН. Дайте мне знать, если я не понимаю, и я попытаюсь помочь снова.

3 голосов
/ 14 января 2009

Вам нужно прочитать эту статью.

Каковы наиболее распространенные анти-паттерны SQL?

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

Да, посмотрите на мой ответ в вышеприведенной статье и напишите цикл обхода ключа, используя Item # 2.

Убедитесь, что при написании оператора вставки вы предоставляете список полей - как я сказал в пункте №1.

0 голосов
/ 14 января 2009

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

Если время выполнения является ограничением, я бы настоятельно рекомендовал использовать Bcp (или какой-либо другой инструмент, применимый в зависимости от платформы)

Выберите идентификаторы из исходной таблицы, используйте их для создания Bcp-файла для таблицы расширений, затем введите Bcp.

Многие считают, что Bcp более эффективен в файлах по 10 000 записей, а не в одном файле humungus с 17 000 000 строк.

Кроме того, вы можете сделать это на заднем плане, прежде чем начать работу, и написать задание t-sql, которое можно было забрать, и, возможно, оно было вставлено после того, как вы взяли магазин моментальных снимков идентификаторов.

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