è possibile scambiare i valori delle chiavi primarie tra due set di dati? Se sì, come si farebbe?sql scambia i valori delle chiavi primarie
risposta
diamo per ragioni di semplicità si supponga di avere due record
id name
---------
1 john
id name
---------
2 jim
sia da tavolo t (ma possono provenire da diverse tabelle)
si potrebbe fare
UPDATE t, t as t2
SET t.id = t2.id, t2.id = t.id
WHERE t.id = 1 AND t2.id = 2
Nota : L'aggiornamento delle chiavi primarie ha altri effetti collaterali e forse l'approccio preferito sarebbe lasciare le chiavi primarie come sono e scambiare i valori di tutti e altre colonne.
Avvertenza: Il motivo per cui lo t.id = t2.id, t2.id = t.id
funziona è perché in SQL l'aggiornamento avviene a livello di transazione. t.id
non è variabile e =
non è un'assegnazione. Potresti interpretarlo come "imposta t.id sul valore t2.id prima dell'effetto della query, imposta t2.id sul valore che t.id aveva prima dell'effetto della query". Tuttavia, alcuni database potrebbero non fare un corretto isolamento, si veda questo question per esempio (tuttavia, eseguendo la query sopra, che è probabilmente considerata aggiornamento multi tabella, si è comportata secondo lo standard in mysql).
grazie mille irragionevole! – Thomas
Errore in MySQL 5.1.62 con 'ERROR 1062 (23000): voce duplicata '2' per la chiave 'PRIMARY''. – dotancohen
La tua soluzione non funziona in MySQL 5.5.22-log: '1706 - L'aggiornamento della chiave primaria/chiave di partizione non è consentito poiché la tabella viene aggiornata sia come 'lae_marketing_invoice_history' che come 't2'. –
preferisco il seguente approccio (Justin Cave ha scritto simile da qualche parte):
update MY_TABLE t1
set t1.MY_KEY = (case when t1.MY_KEY = 100 then 101 else 100 end)
where t1.MYKEY in (100, 101)
L'inserimento dei valori della chiave non elaborata come valori letterali nella query risolve il problema problema delle chiavi duplicate durante la transazione. –
Simile a @ soluzione di Bart, ma ho usato un modo leggermente diverso:
update t
set t.id=(select decode(t.id, 100, 101, 101, 100) from dual)
where t.id in (100, 101);
Questa è proprio la stessa cosa , ma so decode
meglio di case
.
Inoltre, per rendere il lavoro @ soluzione di Bart per me ho dovuto aggiungere un when
:
update t
set t.id = (case when t.id = 100 then 101 else 101 end)
where t.id in (100, 101);
- 1. SQL Chiavi esterne multiple come chiavi primarie
- 2. Denominazione delle chiavi primarie "id" vs "something_id" in SQL
- 3. Ordinamento chiavi primarie
- 4. MYSQL Aggiorna tutti i valori delle chiavi esterne
- 5. Convenzioni di denominazione dei vincoli delle chiavi primarie NHibernate
- 6. @OneToMany e chiavi primarie composite?
- 7. come ottenere i nomi delle colonne delle chiavi primarie per una determinata tabella?
- 8. SQL: cosa fanno esattamente le chiavi primarie e gli indici?
- 9. django converte l'elenco degli oggetti nell'elenco delle chiavi primarie
- 10. penalità di prestazioni delle stringhe come chiavi primarie?
- 11. Progettazione database - convenzioni di denominazione delle chiavi primarie
- 12. NHibernate mappatura chiavi primarie multiple
- 13. Chiavi primarie con Apache Spark
- 14. Doctrine - Tabella senza chiavi primarie
- 15. L'archivio di chiavi/valori persistente distribuito più semplice che supporta le query dell'intervallo di chiavi primarie
- 16. mysql chiavi primarie illimitate incremento automatico
- 17. Selezione chiavi primarie che non hanno chiavi esterne in un'altra tabella
- 18. Array PHP - Trasformare i valori delle matrici in Chiavi
- 19. Inserimento di record con chiavi primarie autoincrementanti
- 20. interrogazione SQLite per trovare le chiavi primarie
- 21. Chiavi primarie e esterne in pgAdmin
- 22. ordinamento unix, con chiavi primarie e secondarie
- 23. Ordina array e mantenere valori delle chiavi
- 24. Due colonne come chiavi primarie in mysql?
- 25. Postgres e indici su chiavi esterne e chiavi primarie
- 26. SQLAlchemy dichiarativo: tabella senza chiavi primarie?
- 27. qualcuno può spiegarmi cosa fanno effettivamente le chiavi primarie?
- 28. Solr DIH delta-import con le chiavi primarie composte?
- 29. Mappatura uno-a-uno NHibernate, chiavi non primarie
- 30. Test unità MSTest (VS 2012) vs. SQL Server, collisioni di chiavi primarie intermittenti
Inoltre ho idea di che cosa, in particolare, si sta cercando di realizzare. – bmargulies
Perché vorresti farlo? Non ti piacciono le tue chiavi primarie? ;) –
E sì, è possibile. Ad esempio, in perl c'è il fetchall_hashref che accetta qualsiasi nome di colonna da utilizzare. – Konerak