Этот вопрос близок к тому, что мне нужно, но мой сценарий немного отличается. Исходная таблица и таблица назначения одинаковы, а первичный ключ - это уникальный идентификатор (guid). Когда я пробую это:
insert into MyTable
select * from MyTable where uniqueId = @Id;
Я, очевидно, получаю нарушение ограничения первичного ключа, поскольку пытаюсь скопировать первичный ключ. На самом деле я вообще не хочу копировать первичный ключ. Скорее хочу создать новый. Кроме того, я хотел бы выборочно скопировать определенные поля, а остальные оставить пустыми. Чтобы усложнить ситуацию, мне нужно взять первичный ключ исходной записи и вставить его в другое поле копии (поле PreviousId).
Я уверен, что есть простое решение, я просто не знаю достаточно TSQL, чтобы понять, что это такое.
источник
Хорошо, я знаю, что это старая проблема, но я все равно отправляю свой ответ.
Мне нравится это решение. Мне нужно только указать столбец (-ы) идентичности.
Столбец «id» - это столбец идентификации, и это единственный столбец, который мне нужно указать. В любом случае это лучше, чем наоборот. :-)
Использую SQL Server. Вы можете использовать "
CREATE TABLE
" и "UPDATE TABLE
" в строках 1 и 2. Хм, я увидел, что на самом деле не дал того ответа, который он хотел. Он также хотел скопировать идентификатор в другой столбец. Но это решение подходит для создания копии с новым авто-идентификатором.Я редактирую свое решение с использованием идей Майкла Диббетса.
Вы можете отбросить более одного столбца, разделив их знаком «,». Вместо: id следует подставить идентификатор строки, которую вы хотите скопировать. MyDatabase, MyTable и IndexField следует заменить своими именами (конечно).
источник
TempTable
, не лучше ли использовать#TempTable
, так что это настоящая временная таблица?use MyDatabase; SELECT * INTO #TempTable FROM [TABLE] WHERE [indexfield] = :id; ALTER TABLE #TempTable DROP COLUMN [indexfield]; INSERT INTO [TABLE] SELECT * FROM #TempTable; DROP TABLE #TempTable;
Таким образом, я знаю, что он будет очищен как можно скорее без каких-либо задержек при записи временного файла на диск.$identity
если не хотите жестко кодировать имя столбца идентификатораЯ предполагаю, что вы пытаетесь избежать записи всех имен столбцов. Если вы используете SQL Management Studio, вы можете легко щелкнуть правой кнопкой мыши по таблице и «Сценарий как вставка» ... тогда вы можете возиться с этим выводом для создания своего запроса.
источник
Укажите все поля, кроме поля вашего идентификатора.
источник
У меня такая же проблема, когда я хочу, чтобы один скрипт работал с таблицей, в которую периодически добавляются столбцы другими разработчиками. Более того, я поддерживаю множество различных версий нашей базы данных, так как не все клиенты могут быть в курсе текущей версии.
Я взял решение Джонаса и немного изменил его. Это позволяет мне сделать копию строки, а затем изменить первичный ключ перед добавлением его обратно в исходную исходную таблицу. Это также очень удобно для работы с таблицами, которые не допускают значений NULL в столбцах, и вам не нужно указывать имя каждого столбца в INSERT.
Этот код копирует строку для "ABC" в "XYZ".
Как только вы закончите опускать временную таблицу.
источник
Я знаю, что мой ответ опаздывает на вечеринку. Но способ, которым я решил, немного отличается от всех ответов.
У меня была ситуация, мне нужно клонировать строку в таблице, кроме нескольких столбцов. У этих немногих появятся новые ценности. Этот процесс должен автоматически поддерживаться для будущих изменений в таблице. Это подразумевает клонирование записи без указания имен столбцов.
Мой подход заключается в том,
источник
источник
Если «ключ» - это ваше поле PK, и оно является автономным.
он сгенерирует новую запись, скопировав field1 и field2 из исходной записи
источник
В моей таблице 100 полей, и мне нужен был запрос, чтобы просто работать. Теперь я могу переключить любое количество полей с помощью некоторой базовой условной логики и не беспокоиться о его порядковом положении.
Замените имя таблицы ниже на имя вашей таблицы
Замените исходное имя поля идентификатора своим именем поля PK
Снова замените имена таблиц (имя целевой таблицы и имя исходной таблицы); отредактируйте свои
where
условияисточник
Сделать можно так:
Там вместо 112 в таблицу DENI / FRIEN01P нужно поставить номер максимального id.
источник
Вот как я сделал это с помощью классического ASP и не смог заставить его работать с приведенными выше ответами, и я хотел иметь возможность скопировать продукт в нашей системе на новый product_id, и мне нужно, чтобы он работал, даже когда мы добавить больше столбцов в таблицу.
источник