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



этот вопрос близок к тому, что мне нужно, но мой сценарий немного отличается. Исходная таблица и таблица назначения совпадают, а первичный ключ-это uniqueidentifier (guid). Когда я пытаюсь это сделать:



insert into MyTable
select * from MyTable where uniqueId = @Id;


Я, очевидно, получаю нарушение ограничения первичного ключа, так как я пытаюсь скопировать первичный ключ. На самом деле, я вообще не хочу копировать первичный ключ. Скорее, я хочу создать новый. Кроме того, я хотел бы выборочно копировать некоторые поля, а остальные оставьте пустыми. Чтобы усложнить ситуацию, мне нужно взять первичный ключ исходной записи и вставить его в другое поле в поле copy (PreviousId).



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

1643   10  

10 ответов:

попробуйте это:


insert into MyTable(field1, field2, id_backup)
    select field1, field2, uniqueId from MyTable where uniqueId = @Id;

все не указанные поля должны получить значение по умолчанию (которое обычно равно NULL, если оно не определено).

хорошо, я знаю, что это старая проблема, но я все равно отправляю свой ответ.

мне нравится это решение. Мне нужно только указать столбец(ы) идентификаторов.

SELECT * INTO TempTable FROM MyTable_T WHERE id = 1;
ALTER TABLE TempTable DROP COLUMN id;
INSERT INTO MyTable_T SELECT * FROM TempTable;
DROP TABLE TempTable;

столбец "id" - это столбец идентификаторов, и это единственный столбец, который я должен указать. В любом случае, это лучше, чем наоборот. : -)

Я использую SQL Server. Вы можете использовать "CREATE TABLE" и "UPDATE TABLE " в строке 1 и 2. Хм, я видел, что на самом деле не дал ответа, который он хотел. Он хотел скопируйте идентификатор также в другой столбец. Но это решение хорошо подходит для создания копии с новым авто-идентификатором.

я редактирую свое решение с idéas от Michael Dibbets.

use MyDatabase; 
SELECT * INTO #TempTable FROM [MyTable] WHERE [IndexField] = :id;
ALTER TABLE #TempTable DROP COLUMN [IndexField]; 
INSERT INTO [MyTable] SELECT * FROM #TempTable; 
DROP TABLE #TempTable;

вы можете удалить более одного столбца, разделив их с помощью",". Идентификатор :должен быть заменен идентификатором строки, которую вы хотите скопировать. MyDatabase, MyTable и IndexField должны быть заменены на ваши имена (конечно).

укажите все поля, кроме поля ID.

INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId)
SELECT FIELD2, NULL, ..., FIELD529, FIELD1
FROM MyTable
WHERE FIELD1 = @Id;

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

insert into MyTable (uniqueId, column1, column2, referencedUniqueId)
select NewGuid(), // don't know this syntax, sorry
  column1,
  column2,
  uniqueId,
from MyTable where uniqueId = @Id

Если "ключ" - это ваше поле PK, и оно является автонумерическим.

insert into MyTable (field1, field2, field3, parentkey)
select field1, field2, null, key from MyTable where uniqueId = @Id

он будет генерировать новую запись, копируя field1 и field2 из исходной записи

вы можете сделать так:

INSERT INTO DENI/FRIEN01P 
SELECT 
   RCRDID+112,
   PROFESION,
   NAME,
   SURNAME,
   AGE, 
   RCRDTYP, 
   RCRDLCU, 
   RCRDLCT, 
   RCRDLCD 
FROM 
   FRIEN01P      

там вместо 112 вы должны поставить число максимального id в таблице DENI / FRIEN01P.

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

  1. замените ниже имя таблицы с именем таблицы

    SQLcolums = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_NAME = 'TABLE-NAME')"
    
    Set GetColumns = Conn.Execute(SQLcolums)
    Do WHILE not GetColumns.eof
    
    colName = GetColumns("COLUMN_NAME")
    
  2. замените исходное имя поля идентификатора на имя поля PK

    IF colName = "ORIGINAL-IDENTITY-FIELD-NAME" THEN ' ASSUMING THAT YOUR PRIMARY KEY IS THE FIRST FIELD DONT WORRY ABOUT COMMAS AND SPACES
        columnListSOURCE = colName 
        columnListTARGET = "[PreviousId field name]"
    ELSE
        columnListSOURCE = columnListSOURCE & colName
        columnListTARGET = columnListTARGET & colName
    END IF
    
    GetColumns.movenext
    
    loop
    
    GetColumns.close    
    
  3. снова замените имена таблиц (как имя целевой таблицы, так и источник имя таблицы); редактировать where условия

    SQL = "INSERT INTO TARGET-TABLE-NAME (" & columnListTARGET & ") SELECT " & columnListSOURCE & " FROM SOURCE-TABLE-NAME WHERE (FIELDNAME = FIELDVALUE)" 
    Conn.Execute(SQL)
    

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

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

этот код копирует строку для ' ABC 'в'XYZ'

SELECT * INTO #TempRow FROM SourceTable WHERE KeyColumn = 'ABC';
UPDATE #TempRow SET KeyColumn = 'XYZ';
INSERT INTO SourceTable SELECT * FROM #TempRow;
DELETE #TempRow;

после того, как вы закончите падение временной таблицы.

DROP TABLE #TempRow;

Я знаю, что мой ответ опоздал на вечеринку. Но то, как я решил, немного отличается от всех ответов.

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

мой подход заключается в том,

  1. Запрос Sys.Столбцы, чтобы получить полный список столбцов таблицы и имена столбцов, чтобы пропустить предложение where.
  2. преобразовать в CSV в качестве имен столбцов.
  3. Build Select ... Вставить в скрипт на основе этого.


declare @columnsToCopyValues varchar(max), @query varchar(max)
SET @columnsToCopyValues = ''

--Get all the columns execpt Identity columns and Other columns to be excluded. Say IndentityColumn, Column1, Column2 Select @columnsToCopyValues = @columnsToCopyValues + [name] + ', ' from sys.columns c where c.object_id = OBJECT_ID('YourTableName') and name not in ('IndentityColumn','Column1','Column2') Select @columnsToCopyValues = SUBSTRING(@columnsToCopyValues, 0, LEN(@columnsToCopyValues)) print @columnsToCopyValues

Select @query = CONCAT('insert into YourTableName (',@columnsToCopyValues,', Column1, Column2) select ', @columnsToCopyValues, ',''Value1'',''Value2'',', ' from YourTableName where IndentityColumn =''' , @searchVariable,'''')

print @query exec (@query)

Comments

    Ничего не найдено.