W MySQL próbuję skopiować wiersz z autoinkrementacją column ID=1
i wstawić dane do tej samej tabeli, co nowy wiersz column ID=2
.
Jak mogę to zrobić w jednym zapytaniu?
Użyj INSERT ... SELECT
:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
gdzie c1, c2, ...
są wszystkie kolumny oprócz id
. Jeśli chcesz jawnie wstawić z id
2, umieść to na liście kolumn WSTAW i wybierz:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
Oczywiście id
w drugim przypadku musisz zająć się możliwym duplikatem 2.
IMO, najlepiej wydaje się używać instrukcji sql tylko do kopiowania tego wiersza, a jednocześnie tylko do odwoływania się do kolumn, które musisz i chcesz zmienić.
Zobacz także av8n.com - jak sklonować rekord SQL
Korzyści:
your_table
w jednej operacji atomowej.źródło
Error Code: 1113. A table must have at least 1 column
.SET id=NULL
może powodować błądColumn 'id' cannot be null
. Powinien zostać zastąpiony przezUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
Powiedz, że stół jest
user(id, user_name, user_email)
.Możesz użyć tego zapytania:
źródło
Result: near "SELECT": syntax error
Pomogło to i obsługuje kolumny BLOB / TEXT.
źródło
Aby uzyskać szybkie, czyste rozwiązanie, które nie wymaga nazywania kolumn, możesz użyć przygotowanej instrukcji, jak opisano tutaj: https://stackoverflow.com/a/23964285/292677
Jeśli potrzebujesz złożonego rozwiązania, które możesz wykonywać często, możesz skorzystać z tej procedury:
Możesz go uruchomić za pomocą:
Przykłady
ZASTRZEŻENIE: To rozwiązanie jest przeznaczone tylko dla kogoś, kto często będzie powtarzał wiersze w wielu tabelach. Może być niebezpieczne w rękach nieuczciwego użytkownika.
źródło
Możesz również podać „0” jako wartość kolumny do automatycznego przyrostu, przy tworzeniu rekordu zostanie użyta poprawna wartość. Jest to o wiele łatwiejsze niż tabele tymczasowe.
Źródło: Kopiowanie wierszy w MySQL (patrz drugi komentarz TRiG do pierwszego rozwiązania autorstwa Lore)
źródło
Wiele świetnych odpowiedzi tutaj. Poniżej znajduje się przykład procedury składowanej, którą napisałem, aby wykonać to zadanie dla opracowywanej przeze mnie aplikacji sieci Web:
źródło
źródło
Jeśli możesz używać MySQL Workbench, możesz to zrobić, klikając prawym przyciskiem myszy wiersz i wybierając „Kopiuj wiersz”, a następnie klikając prawym przyciskiem myszy pusty wiersz i wybierając „Wklej wiersz”, a następnie zmieniając identyfikator, a następnie klikając „Zastosuj”.
Skopiuj wiersz:
Wklej skopiowany wiersz do pustego wiersza:
Zmień identyfikator:
Zastosować:
źródło
Szukałem tej samej funkcji, ale nie używam MySQL. Chciałem skopiować WSZYSTKIE pola oprócz oczywiście klucza podstawowego (id). To było zapytanie jednorazowe, którego nie można używać w żadnym skrypcie ani kodzie.
Znalazłem się w PL / SQL, ale jestem pewien, że zrobiłoby to każde inne IDE SQL. Zrobiłem podstawowy
Następnie wyeksportuj go do pliku SQL, w którym mógłbym znaleźć
Właśnie go edytowałem i użyłem:
źródło
Zwykle używam odmiany tego, co mu jest zbyt krótkie:
Tak długo, jak tabele mają identyczne pola (z wyjątkiem automatycznego przyrostu w tabeli dziennika), działa to dobrze.
Ponieważ w miarę możliwości korzystam z procedur przechowywanych (aby ułatwić życie innym programistom, którzy nie są zbyt obeznani z bazami danych), rozwiązuje to problem konieczności cofania się i aktualizowania procedur za każdym razem, gdy dodajesz nowe pole do tabeli.
Zapewnia również, że jeśli dodasz nowe pola do tabeli, natychmiast zaczną pojawiać się w tabeli dziennika bez konieczności aktualizowania zapytań do bazy danych (chyba że masz takie, które wyraźnie ustawiają pole)
Ostrzeżenie: Pamiętaj, aby dodać nowe pola do obu tabel jednocześnie, aby kolejność pól pozostała taka sama ... w przeciwnym razie zaczniesz otrzymywać dziwne błędy. Jeśli jesteś jedynym, który pisze interfejsy bazy danych ORAZ jesteś bardzo ostrożny, to działa dobrze. W przeciwnym razie trzymaj się nazewnictwa wszystkich swoich pól.
Uwaga: Z drugiej strony, chyba że pracujesz nad projektem solowym, masz pewność, że inni nie będą pracować nad tym, aby jawnie wypisywać wszystkie nazwy pól i aktualizować instrukcje dziennika w miarę zmiany schematu. Ten skrót prawdopodobnie nie jest wart długoterminowego bólu głowy, który może powodować ... zwłaszcza w systemie produkcyjnym.
źródło
źródło
Zrzuć wiersz, który chcesz sql, a następnie użyj wygenerowanego kodu SQL, bez kolumny identyfikatora, aby zaimportować go ponownie.
źródło