¿es posible intercambiar valores de clave primaria entre dos conjuntos de datos? Si es así, ¿cómo lo haría uno?valores clave clave de intercambio sql
Respuesta
Déjenos en aras de la simplicidad se supone que tiene dos registros
id name
---------
1 john
id name
---------
2 jim
ambos de la tabla t (pero pueden provenir de diferentes tablas)
que podría hacer
UPDATE t, t as t2
SET t.id = t2.id, t2.id = t.id
WHERE t.id = 1 AND t2.id = 2
Nota : La actualización de claves principales tiene otros efectos secundarios y tal vez el enfoque preferido sería dejar las claves primarias tal como están e intercambiar los valores de todos los th e otras columnas.
Advertencia: La razón por la cual el t.id = t2.id, t2.id = t.id
funciona es porque en SQL la actualización ocurre en un nivel de transacción. El t.id
no es variable y =
no es una asignación. Podría interpretarlo como "establecer t.id al valor t2.id tenido antes del efecto de la consulta, establecer t2.id al valor t.id tenido antes del efecto de la consulta". Sin embargo, es posible que algunas bases de datos no realicen el aislamiento adecuado; consulte esto question por ejemplo (sin embargo, ejecutar la consulta anterior, que probablemente se considere actualización de varias tablas, se comportó de acuerdo con el estándar en mysql).
muchas gracias sinrazón! – Thomas
falla en MySQL 5.1.62 con 'ERROR 1062 (23000): entrada duplicada '2' para la clave 'PRIMARY''. – dotancohen
Su solución no funciona en MySQL 5.5.22-log: '1706 - La clave primaria/clave de partición no está actualizada ya que la tabla se actualiza como 'lae_marketing_invoice_history' y 't2'. –
Yo prefiero el siguiente enfoque (Justin Cueva escribió similares en alguna 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)
Al poner los valores de clave sin procesar como literales en la consulta se resuelve el problema de claves duplicadas durante la transacción. –
similares a @ solución de Bart, pero utiliza una forma ligeramente diferente:
update t
set t.id=(select decode(t.id, 100, 101, 101, 100) from dual)
where t.id in (100, 101);
Esto es exactamente lo mismo , pero sé decode
mejor que case
.
Además, para hacer el trabajo @ solución de Bart para mí he tenido que añadir un when
:
update t
set t.id = (case when t.id = 100 then 101 else 101 end)
where t.id in (100, 101);
- 1. Clave múltiple como clave externa (SQL)
- 2. SQL Server PIVOT en la tabla de valores-clave
- 3. ¿palabras clave SQL estándar?
- 4. intercambio de clave pública como un objeto serializado
- 5. DataGridView: ¿Determina los valores o las relaciones clave SQL?
- 6. clave Conde/Valores en JSON
- 7. SQL Inserciones de clave únicas
- 8. ¿Lista ordenada de pares de valores clave?
- 9. clave primaria sql e índice
- 10. clave externa condicional en SQL
- 11. Obteniendo múltiples valores clave de Redis
- 12. app.config múltiples valores de clave única
- 13. ¿Cómo obtengo los valores clave de $ _POST?
- 14. Par de valores clave como enumeración
- 15. jQuery serializeArray() pares de valores clave
- 16. "Codificación de valores-clave" para Java
- 17. array_push() con el par de valores clave
- 18. Convertir entradas en clave, pares de valores
- 19. Pares de valores clave usando JSON
- 20. pares de valores clave en C# Parámetros
- 21. ¿Qué son la clave candidata, la clave alternativa, la clave compuesta en sql?
- 22. C# diccionario una clave muchos valores
- 23. C# Diccionario con dos valores por clave?
- 24. C# diccionario con múltiples valores por clave
- 25. std :: correlacionar una clave, dos valores
- 26. Volver valores únicos por clave en CouchDB
- 27. clave primaria versus clave
- 28. ¿Crear identidad de SQL como clave principal?
- 29. Pares de valores clave en la base de datos relacional
- 30. Intercambio de tablas ms-sql
También tengo ni idea de lo que, en detalle, que está tratando de lograr. – bmargulies
¿Por qué querrías hacer eso? ¿No te gustan tus llaves principales? ;) –
Y sí, es posible. Por ejemplo, en perl existe el fetchall_hashref que acepta cualquier nombre de columna para ser utilizado. – Konerak