insert into table select * from table where primarykey=1
Chcę tylko skopiować jeden wiersz, aby wstawić go do tej samej tabeli (tj. Chcę zduplikować istniejący wiersz w tabeli), ale chcę to zrobić bez konieczności wyszczególniania wszystkich kolumn po opcji „wybierz”, ponieważ ta tabela ma za dużo kolumn.
Ale kiedy to robię, pojawia się błąd:
Powielony wpis „xxx” dla klucza 1
Mogę sobie z tym poradzić, tworząc inną tabelę z tymi samymi kolumnami, co tymczasowy kontener dla rekordu, który chcę skopiować:
create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;
Czy istnieje prostszy sposób rozwiązania tego problemu?
mysql
copy
duplicates
row
lina
źródło
źródło
max(oldtable.id) + oldtable_temp.key
ten sposób, aby upewnić się, że identyfikatory rosną i są unikalne.Odpowiedzi:
Użyłem techniki Leonarda Challisa z kilkoma zmianami:
Jako tabela tymczasowa nigdy nie powinno być więcej niż jeden rekord, więc nie musisz martwić się o klucz podstawowy. Ustawienie wartości null umożliwia MySQL wybranie samej wartości, więc nie ma ryzyka utworzenia duplikatu.
Jeśli chcesz mieć całkowitą pewność, że dostajesz tylko jeden wiersz do wstawienia, możesz dodać LIMIT 1 na końcu wiersza INSERT INTO.
Zauważ, że dołączyłem również wartość klucza podstawowego (w tym przypadku 1) do nazwy mojej tabeli tymczasowej.
źródło
tmptable_1
porównaniu ztmptable
)primarykey
INT NULL; po pierwszej linii, aby rozwiązanie działałoAktualizacja 07/07/2014 - Odpowiedź oparta na mojej odpowiedzi, przez Grim ... , jest lepszym rozwiązaniem, ponieważ ulepsza moje rozwiązanie poniżej, więc proponuję jej użyć.
Możesz to zrobić bez wyświetlania wszystkich kolumn o następującej składni:
Możesz zdecydować się na zmianę klucza podstawowego w inny sposób.
źródło
tmptable
, nie musisz dodawaćWHERE primarykey = 2
instrukcji również do ostatniego wiersza. (To znaczy tylkoINSERT INTO table SELECT * FROM tmptable
.)Zakładam, że chcesz, aby nowa płyta miała nowy
primarykey
? Jeśliprimarykey
tak,AUTO_INCREMENT
po prostu zrób to:... gdzie
col1, col2, col3, ...
są wszystkie kolumny w tabeli z wyjątkiemprimarykey
.Jeśli to nie jest
AUTO_INCREMENT
kolumna i chcesz mieć możliwość wybrania nowej wartości,primarykey
ponieważ jest podobna:... gdzie
567
jest nowa wartość dlaprimarykey
.źródło
Prawie miałeś to przy pierwszym zapytaniu, wystarczy określić kolumny, w ten sposób możesz wykluczyć klucz podstawowy we wkładce, co spowoduje automatyczne zwiększenie, które prawdopodobnie masz w tabeli, aby automatycznie utworzyć nowy klucz podstawowy dla wejście.
Na przykład zmień to:
Do tego:
Po prostu nie uwzględniaj kolumny klucza podstawowego ani na liście kolumn dla INSERT, ani dla części SELECT zapytania.
źródło
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
lub coś podobnego?Możesz także spróbować zrzucić tabelę, znaleźć polecenie wstawiania i edytować je:
--skip-extended-insert
Daje jedno polecenie insert każdym wierszu. Możesz wtedy znaleźć wiersz w swoim ulubionym edytorze tekstu, wyodrębnić polecenie i zmienić klucz podstawowy na „domyślny”.źródło
Ta procedura zakłada, że:
Oczywiście nie jest to idealne rozwiązanie, ale w niektórych (prawdopodobnie większości) przypadków zadziała.
źródło
works
ale podejście jest rozsądne i ma wartość, ponieważ jest tutaj wyjątkowe i faktycznie odpowiada na pytanie PO.Można to osiągnąć przy odrobinie kreatywności:
Spowoduje to, że nowy wiersz otrzyma automatycznie zwiększany identyfikator zamiast identyfikatora z wybranego wiersza.
źródło
Jeśli pole klucza podstawowego tabeli jest polem automatycznie zwiększającym, możesz użyć zapytania z kolumnami. Na przykład tabela o nazwie
test_tbl
ma 3 pola jakoid, name, age
.id
jest polem klucza podstawowego i automatycznym zwiększaniem, więc możesz użyć następującego zapytania, aby zduplikować wiersz:To zapytanie powoduje zduplikowanie każdego wiersza.
Jeśli pole klucza podstawowego tabeli nie jest polem automatycznego zwiększania wartości, możesz użyć następującej metody:
Wynikiem tego zapytania jest zduplikowany wiersz
id=19
wstawiony jakoid=20
.źródło
tableName
(fieldName1
,fieldName2
,fieldName3
) SELECTfieldName1
,fieldName2
,fieldName3
ODtableName
KTÓRYCH 1 (skopiować je wszystkie na raz)klonuj wiersz z polami aktualizacji i wartością automatycznego zwiększania
źródło
Z tej witryny zebrano niektóre z poniższych informacji. Oto, co zrobiłem, aby zduplikować rekord w tabeli z dowolną liczbą pól:
Zakłada się również, że na początku tabeli znajduje się pole AI
źródło
Użyłem techniki Grima z niewielką zmianą: Jeśli ktoś szuka tego zapytania, to dlatego, że nie może wykonać prostego zapytania z powodu problemu z kluczem podstawowym:
W mojej instalacji MySql 5.6.26 klucz nie dopuszcza wartości null i powoduje błąd:
Więc po utworzeniu tabeli tymczasowej zmieniam klucz podstawowy na dopuszczający wartość null.
źródło
Mogę się z tym spóźnić, ale mam podobne rozwiązanie, które mi się sprawdziło.
W ten sposób nie muszę tworzyć tymczasowej tabeli itp. Ponieważ wiersz jest kopiowany w tej samej tabeli,
Max(PK)+1
funkcja może być łatwo używana.Przyszedłem szukać rozwiązania tego pytania (zapomniałem składni) i ostatecznie stworzyłem własne zapytanie. Zabawne, jak czasem sprawy się układają.
pozdrowienia
źródło
Jeśli klucz podstawowy to Autoinkrementacja, po prostu określ każde pole z wyjątkiem klucza podstawowego.
INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1
źródło
Zaktualizowałem rozwiązanie @ LeonardChallis, ponieważ nie działało dla mnie jak żadne inne. Usunąłem
WHERE
klauzule iSET primaryKey = 0
tabelę tymczasową, więc MySQL automatycznie zwiększa swój klucz primaryKeyMa to oczywiście na celu zduplikowanie wszystkich wierszy w tabeli.
źródło
Użyłbym poniżej,
źródło
W mojej bazie danych Koha wstawiłem zduplikowane elementy z prefiksem „C” w kolumnie z kodem kreskowym :
źródło
Po prostu musiałem to zrobić i to było moje ręczne rozwiązanie:
Jeśli nie wiesz, co to jest pole PODSTAWOWE , spójrz wstecz na swoją stronę phpmyadmin , kliknij kartę „Struktura” , a na dole strony pod pozycją „Indeksy” pokaże się, które pole ma „Nazwę klucza” wartość „PODSTAWOWA” .
Trochę długa droga dookoła, ale jeśli nie chcesz zajmować się znacznikami i po prostu musisz zduplikować pojedynczy wiersz.
źródło
Pokazane powyżej rozwiązanie sprawdza się doskonale również dla wybranych rzędów. Na przykład tworzę wiersze demonstracyjne dla mojego projektu nice2work i działa to doskonale.
źródło
Przepraszam za nekropostę, ale to właśnie znalazłem w Google i ponieważ uznałem to za pomocne, ale problematyczne, chciałem wnieść ważną modyfikację dla każdego, kto to wykopie.
Po pierwsze, używam SQL Server, a nie MySQL, ale myślę, że powinno działać podobnie. Użyłem rozwiązania Leonarda Challisa, ponieważ było najprostsze i spełniło wymagania, jednak jest z tym problem - jeśli po prostu weźmiesz PK i zwiększysz ją o 1, to co się stanie, jeśli dodałeś inne rekordy od czasu dodania danego wiersza . Zdecydowałem, że najlepiej będzie po prostu pozwolić systemowi zająć się autoinkrementacją PK, więc zrobiłem co następuje:
Uważam, że działałoby to podobnie w MySQL, ale nie mogę tego przetestować, przepraszam
źródło
Wiem, że to stare pytanie, ale oto inne rozwiązanie:
Powoduje to duplikowanie wiersza w tabeli głównej, przy założeniu, że klucz podstawowy jest automatycznie zwiększany i tworzy kopie danych tabel połączonych z nowym identyfikatorem tabeli głównej.
Inne opcje pobierania nazw kolumn:
-POKAŻ KOLUMNY Z
tablename
; (Nazwa kolumny: Pole)-DESCRIBE
tablename
(Nazwa kolumny: Pole)-WYBIERZ nazwa_kolumny Z schematu_informacyjnego.columns WHERE nazwa_tabeli = 'nazwa_tabeli' (Nazwa kolumny: nazwa_kolumny)
źródło
max233 z pewnością był na dobrej drodze, przynajmniej w przypadku autoincrement. Jednak nie wykonuj ALTER TABLE. Po prostu ustaw pole autoinkrementacji w tabeli tymczasowej na NULL. Spowoduje to wystąpienie błędu, ale nastąpi następujące WSTAWIENIE wszystkich pól w tabeli tymczasowej, a pole automatyczne NULL otrzyma unikalną wartość.
źródło
Utwórz tabelę
Wstaw wiersz
Klonuj wstawkę wiersza powyżej
Test
źródło
Oto odpowiedź, którą znalazłem w tej witrynie. Opisuje, jak wykonać powyższe 1. Odpowiedź znajduje się na dole strony. Zasadniczo to, co robisz, to kopiowanie wiersza do skopiowania do tymczasowej tabeli przechowywanej w pamięci. Następnie możesz zmienić numer klucza podstawowego za pomocą aktualizacji. Następnie wstaw go ponownie do tabeli docelowej. Następnie upuszczasz stół.
Oto kod:
Stworzyłem tymczasowy stół ratunkowy. Skopiowałem wiersz z mojej oryginalnej tabeli fitnessreport4. Następnie ustawiam klucz podstawowy dla wiersza w tabeli tymczasowej na null, aby móc skopiować go z powrotem do oryginalnej tabeli bez otrzymywania błędu Duplicate Key. Wypróbowałem ten kod wczoraj wieczorem i zadziałał.
źródło
To jest dodatkowe rozwiązanie dla odpowiedzi „Grim…” Pojawiły się komentarze na temat tego, że klucz podstawowy jest pusty. Kilka uwag o tym nie działa. I kilka uwag na temat rozwiązań. Żadne z rozwiązań nie zadziałało dla nas. Mamy MariaDB ze stołem InnoDB.
Nie mogliśmy ustawić klucza podstawowego, aby zezwolić na null. Użycie 0 zamiast NULL doprowadziło do zduplikowania błędu wartości dla klucza podstawowego.
SET SQL_SAFE_UPDATES = 0;
Nie działał też.Rozwiązanie z „Ponurego ...” zadziałało, JEŚLI zamiast tego zmieniliśmy nasz KLUCZ PODSTAWOWY na UNIQUE
źródło
Chciałem tylko opublikować swój fragment kodu PHP, ponieważ myślę, że sposób, w jaki zbieram kolumny, jest nieco bardziej przejrzysty w kodzie niż w poprzednich przykładach. Pokazuje również, jak łatwo można zmienić pole, w tym przypadku dodając ciąg. Ale możesz również zastąpić pole klucza obcego nowo dodanym rekordem, na wypadek gdybyś chciał również skopiować niektóre rekordy podrzędne.
źródło
Aby uzyskać bardzo proste rozwiązanie, możesz użyć PHPMyAdmin do wyeksportowania wiersza jako pliku CSV, a następnie po prostu zaimportuj zmieniony plik CSV. Edycja kolumny ID / primarykey tak, aby nie pokazywała żadnej wartości przed jej zaimportowaniem.
Następnie na dole strony:
Gdzie jest napisane „Eksportuj”, po prostu wyeksportuj, a następnie edytuj plik csv, aby usunąć wartość klucza podstawowego, tak aby był pusty, a następnie po prostu zaimportuj go do bazy danych, nowy klucz podstawowy zostanie przypisany podczas importu.
źródło