Es posible incremento automático de una Clave Principal?

Tabla «book_comments»

book_id     medium_int
timestamp   medium_int
user_id     medium_int
vote_up     small_int
vote_down   small_int
comment     text
comment_id  medium_int

Primary key -> (book_id, timestamp, user_id)

No habrá otros índices en esta tabla. Sin embargo, me gustaría hacer el comment_id columna autoincrement por lo que fácilmente se puede crear otra tabla:

Tabla «book_comments_votes»

comment_id  (medium_int)
user_id     (medium_int)

Primary key -> (comment_id, user_id)

Los usuarios podrán votar sólo una vez por comentario libro. Esta tabla aplica esta regla por parte de la clave primaria.

Pregunta:

Es posible la auto-incremento de un no – Clave Principal como en el de la auto-incremento de la comment_id columna en la tabla «book_comments»?

Alternativas, La Discusión:

Me gustaría hacer esto por simplicidad, como se explicó anteriormente. Las alternativas no son prometedores.

  • Hacer el commnet_id PK y hacer cumplir la integridad a través de un índice único en book_id, timestamp, user_id. En este caso, me gustaría crear un índice adicional.
  • Mantener el PK y reemplazar el comment_id en el book_comments_votes con todo el PK. Esto sería más que triplicar el tamaño de la tabla.

Sugerencias? Los pensamientos?

  • ¿Por qué no puedes simplemente hacer comment_id la clave principal? No entiendo por qué se necesita el extra índice único. Estoy probablemente no comprender el problema.
  • comment_id como la PK no sería suficiente para hacer cumplir la integridad de los datos, específicamente, que no son otros duplicados de usuario votos para un libro específico. Es por eso que un índice único que se necesita con una clave compuesta.
  • De modo que los usuarios sólo pueden votar una vez por libro, no una vez por comentario libro como usted indica en su pregunta?
InformationsquelleAutor ProfileTwist | 2012-12-29

3 Comentarios

  1. 41

    Sí se puede. Usted sólo necesita hacer que la columna sea un índice.

    CREATE TABLE `test` (
      `testID` int(11) NOT NULL,
      `string` varchar(45) DEFAULT NULL,
      `testInc` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`testID`),
      KEY `testInc` (`testInc`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    
    insert into test(
      testID,
     string
    )
    values (
    1,
        'Hello'
    );
    
    
    insert into test( 
    testID,
     string
    )
    values (
    2,
        'world'
    );

    Va a insertar filas con auto-incremento de los valores para la «testInc’. Sin embargo, esto es realmente un tonto cosa que hacer.

    Ya dijo que la manera correcta de hacerlo:

    A»hacer de la comment_id PK y hacer cumplir la integridad a través de un índice único en book_id, timestamp, user_id.»

    Que es exactamente de la manera que debería estar haciendo. No sólo proporcionar un clave principal clave para la tabla que se va a necesitar para las consultas en el futuro, sino que también satisface el principio de la menor sorpresa.

    • «esto es realmente un tonto cosa que hacer». Que es fuerte. Cada característica tiene su caso de uso. He de texto de gran tamaño basado en claves que prefiero que no se propagan a lo largo de mi diseño. Un sustituto de la llave encaja en el proyecto de ley.
    • Un sustituto de la clave es lo que me sugirió que utilizan, en lugar de su original idea tonta.
    • Muchas gracias eres una gran ayuda :))
    • Muchas gracias eres una gran ayuda :))
    • No solo es fuerte, es un mal comentario. Mientras que él está en lo correcto que tener la clave correcta es una buena cosa. Esto no significa que un complejo de clave compuesta de varias columnas es la mejor solución. primaria id entero es muy portátil, un complejo clave no necesariamente.
  2. 1

    Has tabla existente. Si usted ya dio una clave primaria para comment_id y el único propósito es establecer auto_increment. Usted puede quitar la clave principal para esa columna. MySQL permite una columna con cualquier tecla de la propiedad puede tener acceso a auto_increment. Así que mejor probar un índice o unique key a comment_id como el de abajo.

    1.Quitar La Clave Principal

    ALTER TABLE `book_comments` MODIFY `comment_id` INT(5) NOT NULL;
    
    ALTER TABLE `book_comments` DROP PRIMARY KEY ;
    1. Agregar AUTO_INCREMENT con UNIQUE_KEY propiedad.

    ALTER TABLE 'brand_keywords' CHANGE COLUMN 'comment_id' 'comment_id' INT(5) NOT NULL AUTO_INCREMENT UNIQUE;

  3. 0

    MySQL 5.5, parece ser posible sin un índice o clave primaria a un campo INT a estar siempre con autoincrement.

    • Puede usted ? Publica tu código por favor. He intentado en 5.5.23 y 5.6.12: > create table prueba ( usuario varchar(20) not null, id int auto_increment primary key(usuario)); ERROR 1075 (42000): Incorrecta definición de la tabla; no puede ser sólo un auto de la columna y debe ser definida como una clave
    • Lo siento u tiene que agregar un Índice, por mi culpa. create table prueba ( usuario varchar(20) not null, id int auto_increment, índice (id), primary key (usuario))

Dejar respuesta

Please enter your comment!
Please enter your name here