Tengo una tabla donde cada fila está numerada con un índice único (1,2,3, ...). Quiero aumentar el índice de cada entrada en 4, para hacer espacio para cuatro nuevas entradas al principio (índices 1,2,3 y 4).

Intenté usar:

UPDATE table SET key_index = key_index + 4;

Pero resulta en un ERROR porque el índice debe ser, como se dijo, único (aumentando 1 por 4 resultados en 5. El índice 5 ya podría existir).

Si pudiera usar la instrucción UPDATE, comenzando en la parte inferior (del índice más alto al más bajo), entonces habría tal ERROR. ¿Es posible usar una declaración de ACTUALIZACIÓN como esa?

0
Torquestral 15 jun. 2020 a las 17:43

3 respuestas

La mejor respuesta

Esto puede ser complicado. Un truco que utilizo son dos actualizaciones, primero un rango de valores que son "seguros". Segundo a los valores deseados:

update t
    set key_index = - key_index ;

update t
    set key_index = (- key_index) + 4;

También puede soltar el índice / restricción únicos, o deshabilitarlo en algunas bases de datos.

1
Gordon Linoff 15 jun. 2020 a las 14:45

Gordon respondió al punto. Pero si está actualizando el key_index, recuerde también actualizar el valor en las tablas de referencia externas (si las hay).

Alternativamente, puede intentar otro enfoque. Agregue otra columna que diga dup_key_index con el valor key_index + 4. Luego suelte la columna key_index y cambie el nombre de esta nueva columna dup_key_index como columna key_index.

Demostración de SQL Fiddle

# Add new column to hold the key_index value
alter table TABLE_NAME add dup_key_index int not null;

# Update this columns value from the key_index value and increment
update TABLE_NAME set dup_key_index = key_index + 4;

# Drop the key_index
alter table TABLE_NAME drop key_index;

# Rename the new column with same name as key_index
alter table TABLE_NAME change dup_key_index key_index int primary key;

SQL Server: Si está utilizando SQL Server, el motor se ocupa de esto internamente donde funciona la siguiente consulta:

update TABLE_NAME set key_index = key_index + 4;

Consulte esto.

0
Maverick 15 jun. 2020 a las 16:33

Si está ejecutando MySQL, puede usar una update simple, con una cláusula order by que ordena las filas por valor descendente. Esto le permite realizar los cambios en una sola consulta, sin ningún riesgo de colisión (ya que sus valores son únicos).

MySQL admite order by en las declaraciones de actualización, y el comportamiento es descrito en la documentación

Si una instrucción UPDATE incluye una cláusula ORDER BY, las filas se actualizan en el orden especificado por la cláusula. Esto puede ser útil en ciertas situaciones que de lo contrario podrían provocar un error.

La documentación continúa con un ejemplo que se parece a su caso de uso.

Así que:

UPDATE table SET key_index = key_index + 4 ORDER BY id DESC;

Demostración en DB Fiddle :

create table mytable (key_index int);
insert into mytable values (1), (4), (5), (8), (9);

update mytable 
set key_index = key_index + 4
order by key_index desc;

select * from mytable;

| key_index |
| --------- |
| 5         |
| 8         |
| 9         |
| 12        |
| 13        |
0
GMB 15 jun. 2020 a las 16:08