To pytanie jest blisko tego, czego potrzebuję, ale mój scenariusz jest nieco inny. Tabela źródłowa i tabela docelowa są takie same, a klucz podstawowy to unikalny identyfikator (identyfikator guid). Kiedy próbuję tego:
insert into MyTable
select * from MyTable where uniqueId = @Id;
Oczywiście dostaję naruszenie ograniczenia klucza podstawowego, ponieważ próbuję skopiować klucz podstawowy. Właściwie nie chcę w ogóle kopiować klucza podstawowego. Raczej chcę stworzyć nowy. Dodatkowo chciałbym selektywnie kopiować niektóre pola, a pozostałe pozostawić puste. Aby sprawy były bardziej skomplikowane, muszę wziąć klucz podstawowy oryginalnego rekordu i wstawić go do innego pola w kopii (pole PreviousId).
Jestem pewien, że istnieje proste rozwiązanie tego problemu, po prostu nie znam wystarczającej liczby TSQL, aby wiedzieć, co to jest.
źródło
Ok, wiem, że to stary problem, ale i tak publikuję odpowiedź.
Podoba mi się to rozwiązanie. Muszę tylko określić kolumny tożsamości.
Kolumna „id” to kolumna tożsamości i jest to jedyna kolumna, którą muszę określić. I tak jest lepiej niż na odwrót. :-)
Używam SQL Server. Możesz użyć „
CREATE TABLE
” i „UPDATE TABLE
” w wierszach 1 i 2. Hmm, widziałem, że tak naprawdę nie udzieliłem odpowiedzi, której chciał. Chciał również skopiować identyfikator do innej kolumny. Ale to rozwiązanie jest dobre do tworzenia kopii z nowym automatycznym identyfikatorem.Edytuję swoje rozwiązanie, korzystając z pomysłów Michaela Dibbetsa.
Możesz usunąć więcej niż jedną kolumnę, oddzielając je znakiem „,”. Pole: id należy zastąpić identyfikatorem wiersza, który chcesz skopiować. MyDatabase, MyTable i IndexField należy zastąpić swoimi nazwami (oczywiście).
źródło
TempTable
czy nie byłoby lepiej w użyciu#TempTable
, więc jest to prawdziwa tabela tymczasowa?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;
Dzięki temu wiem, że zostanie wyczyszczone jak najszybciej, bez żadnych opóźnień związanych z zapisaniem sporadycznego pliku na dysk.$identity
jeśli nie chcesz na stałe zakodować nazwy swojej kolumny tożsamościDomyślam się, że próbujesz uniknąć zapisywania wszystkich nazw kolumn. Jeśli używasz SQL Management Studio, możesz łatwo kliknąć prawym przyciskiem myszy tabelę i skrypt jako wstaw, a następnie możesz pomieszać się z tymi danymi wyjściowymi, aby utworzyć zapytanie.
źródło
Określ wszystkie pola oprócz pola ID.
źródło
Mam ten sam problem, w którym chcę, aby pojedynczy skrypt działał z tabelą, która ma kolumny dodawane okresowo przez innych programistów. Nie tylko to, ale obsługuję wiele różnych wersji naszej bazy danych, ponieważ klienci mogą nie być na bieżąco z aktualną wersją.
Wziąłem rozwiązanie Jonasa i nieznacznie je zmodyfikowałem. Dzięki temu mogę wykonać kopię wiersza, a następnie zmienić klucz podstawowy przed dodaniem go z powrotem do oryginalnej tabeli źródłowej. Jest to również bardzo przydatne do pracy z tabelami, które nie zezwalają na wartości NULL w kolumnach i nie chcesz określać nazwy każdej kolumny w INSERT.
Ten kod kopiuje wiersz „ABC” do „XYZ”
Po zakończeniu upuszczania tabeli tymczasowej.
źródło
Wiem, że moja odpowiedź jest spóźniona na przyjęcie. Ale sposób, w jaki rozwiązałem, jest nieco inny niż wszystkie odpowiedzi.
Miałem sytuację, w której muszę sklonować wiersz w tabeli oprócz kilku kolumn. Tych kilku będzie miało nowe wartości. Ten proces powinien automatycznie obsługiwać przyszłe zmiany w tabeli. Oznacza to, że należy sklonować rekord bez określania nazw kolumn.
Moje podejście jest takie,
źródło
źródło
Jeśli "klucz" jest twoim polem PK i jest autonumeryczne.
wygeneruje nowy rekord, kopiując pole 1 i pole 2 z oryginalnego rekordu
źródło
Moja tabela ma 100 pól i potrzebowałem zapytania, aby po prostu działało. Teraz mogę przełączać dowolną liczbę pól za pomocą podstawowej logiki warunkowej i nie martwić się o ich pozycję porządkową.
Zastąp poniższą nazwę tabeli nazwą swojej tabeli
Zastąp oryginalną nazwę pola tożsamości nazwą pola PK
Zastąp ponownie nazwy tabel (zarówno nazwa tabeli docelowej, jak i nazwa tabeli źródłowej); edytuj swoje
where
warunkiźródło
Możesz zrobić tak:
Tam zamiast 112 należy wpisać numer maksymalnego identyfikatora w tabeli DENI / FRIEN01P.
źródło
Oto jak to zrobiłem używając klasycznego ASP i nie mogłem go zmusić do pracy z powyższymi odpowiedziami i chciałem móc skopiować produkt w naszym systemie do nowego product_id i potrzebowałem go, aby mógł działać nawet wtedy, gdy dodaj więcej kolumn do tabeli.
źródło