Tengo una tabla user_interactions con 4 columnas:

 user_1
 user_2
 type
 timestamp

La clave principal es (user_1,user_2,type)

y quiero cambiar a (user_2,user_1,type)

Así que lo que hice fue :

drop primary key ...  
add primary key (user_2,user_1,type)...

y voila…

El problema es que la base de datos es vivir en un servidor.

Así que antes de que yo pudiera actualización de la clave primaria, muchos duplicados ya infiltrado, y que se logren en.

¿Qué hacer?

Lo que quiero hacer ahora es eliminar los duplicados y mantener aquellas con las últimas timestamp (que es una columna de la tabla).

Y entonces de alguna manera la actualización de la clave principal de nuevo.

  • De repente me siento mal por cada uno de DBA que me maldijo bajo mi aliento…
  • la próxima vez que agregue una clave única con las columnas de la clave primaria, luego de la actualización de la clave principal
  • tee hee
  • es vivir en un servidor, pero eso es una copia de seguridad-copia de seguridad del servidor :-). Yo no soy un DBA, pero no voy a tratar esto en una REALIDAD servidor en vivo 🙂
  • sí, eso es lo que yo pensaba que ahora, muy tarde 🙂
  • Siempre pensé que una tabla sólo podían tener UNA primary_key. Tienes 3 ?!? Tal vez lo que desea es una PK y los índices de las otras 2 columnas?
  • Es un compuesto clave principal.

InformationsquelleAutor dharm0us | 2010-02-26

3 Comentarios

  1. 199

    La próxima vez, el uso de un único «alter table» instrucción para la actualización de la clave principal.

    alter table xx drop primary key, add primary key(k1, k2, k3);

    Para arreglar las cosas:

    create table fixit (user_2, user_1, type, timestamp, n, primary key( user_2, user_1, type) );
    lock table fixit write, user_interactions u write, user_interactions write;
    
    insert into fixit 
    select user_2, user_1, type, max(timestamp), count(*) n from user_interactions u 
    group by user_2, user_1, type
    having n > 1;
    
    delete u from user_interactions u, fixit 
    where fixit.user_2 = u.user_2 
      and fixit.user_1 = u.user_1 
      and fixit.type = u.type 
      and fixit.timestamp != u.timestamp;
    
    alter table user_interactions add primary key (user_2, user_1, type );
    
    unlock tables;

    La cerradura debe detener las actualizaciones posteriores que viene, mientras que su están haciendo esto. Cuánto tiempo lleva, obviamente, depende del tamaño de tu mesa.

    El principal problema es que si usted tiene algunos duplicados con la misma marca de tiempo.

    • Eres genial ! Me gustaría poder agradecer lo suficiente.
  2. 10

    Si la clave principal pasa a ser un valor auto_increment, usted tiene que quitar el incremento automático, a continuación, suelte la llave primaria, a continuación, vuelva a agregar el incremento automático

    ALTER TABLE `xx`
    MODIFY `auto_increment_field` INT, 
    DROP PRIMARY KEY, 
    ADD PRIMARY KEY (new_primary_key);

    a continuación, vuelva a agregar el incremento automático

    ALTER TABLE `xx` ADD INDEX `auto_increment_field` (auto_increment_field),
    MODIFY `auto_increment_field` int auto_increment;

    a continuación, establezca incremento automático de vuelta a valor anterior

    ALTER TABLE `xx` AUTO_INCREMENT = 5;
  3. 2

    Puede utilizar el IGNORE de palabras clave demasiado, ejemplo:

     update IGNORE table set primary_field = 'value'...............
    • Él está tratando de alterar la columna, no actualización de valor.

Dejar respuesta

Please enter your comment!
Please enter your name here