Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    chiave composta autoincrement mysql

    Ciao a tutti!

    Ho un problema con un db mysql:
    ho una tabella con 2 campi chiave numerici, uno impostato da me e uno auto incremental.
    Quello che vorrei è un risultato tipo

    key1 key2
    1 1
    1 2
    1 3
    2 1
    2 2
    1 4

    dove key1 e impostata da me e per key2 si arrangia lui!ma non riesco a capire che impostazioni devo settare

    Qualcuno sa aiutarmi?

  2. #2
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Che io sappia non si può fare (ma potrei essere smentito), l'auto increment lo può avere solo la chiave primaria ..... che di conseguenza è univoca, quindi quel risultato non lo potrai mai ottenere.

    Però potresti definire una chiave primaria composta da due campi di cui uno autoincrementante

    codice:
    CREATE TABLE tabella(
         key1  INT NOT NULL AUTO_INCREMENT,
         key2  INT NOT NULL,
         PRIMARY KEY (key1, key2)
     ) ;
    Comunque aspetta anche il parere di qualcun'altro più esperto perchè non vorrei che esista un modo per farlo che io non conosco.

  3. #3
    http://dev.mysql.com/doc/refman/5.0/...increment.html

    l'unica condizione e' che la tabella deve essere MyISAM o BDB.

    l'esempio del manuale:

    codice:
    CREATE TABLE animals (
        grp ENUM('fish','mammal','bird') NOT NULL,
        id MEDIUMINT NOT NULL AUTO_INCREMENT,
        name CHAR(30) NOT NULL,
        PRIMARY KEY (grp,id)
    ) ENGINE=MyISAM;
    il prefisso della chiave primaria deve essere il tuo campo ed il suffisso auto increment

    Se cancelli un record questo valore auto increment verra' poi riutilizzato a differenza dell'auto increment classico con un solo campo dove invece il contatore avanza sempre.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    intanto grazie 1000 per le risposte!

    Ma come faccio a fare l'enum su una chiave esterna?

  5. #5
    Originariamente inviato da AlphaBishop
    intanto grazie 1000 per le risposte!

    Ma come faccio a fare l'enum su una chiave esterna?
    non lo fare. Quello e' solo un esempio del manuale. Metti quello che ti serve.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    E' tutto il pomeriggio che ci provo,ma non ne vuole sapere...ho messo l'engine myisam ma l' auto increment continua a funzionare normalmente...c'è qualcosa che mi sfugge?

  7. #7
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Originariamente inviato da las
    Che io sappia non si può fare (ma potrei essere smentito), l'auto increment lo può avere solo la chiave primaria ..... che di conseguenza è univoca, quindi quel risultato non lo potrai mai ottenere.

    Però potresti definire una chiave primaria composta da due campi di cui uno autoincrementante

    codice:
    CREATE TABLE tabella(
         key1  INT NOT NULL AUTO_INCREMENT,
         key2  INT NOT NULL,
         PRIMARY KEY (key1, key2)
     ) ;
    Comunque aspetta anche il parere di qualcun'altro più esperto perchè non vorrei che esista un modo per farlo che io non conosco.
    Mi auto correggo da solo, con il codice che ti ho dato (che è particamente uguale a quello di piero) si può ottenere esattamente la tabella che hai chiesto tu

    key1 key2
    1 1
    1 2
    1 3
    2 1
    2 2
    1 4

    perchè la chiave primaria è l'unione dei due campi, quindi l'univocità è rispettata.

    Originariamente inviato da AlphaBishop
    E' tutto il pomeriggio che ci provo,ma non ne vuole sapere...ho messo l'engine myisam ma l' auto increment continua a funzionare normalmente...c'è qualcosa che mi sfugge?
    ma in effetti l'auto increment per ottenere i risultati che hai chiesto di fatto non lo usi, ma comunque non dovrebbe essere un problema, se nella insert specifichi entrambi i valori questi vengono inseriti (a patto che non ci sia già una coppia di valori uguale) mentre se ometti key1 questa viene calcolata automaticamente incrementando il valore più alto presente.

  8. #8
    Originariamente inviato da AlphaBishop
    E' tutto il pomeriggio che ci provo,ma non ne vuole sapere...ho messo l'engine myisam ma l' auto increment continua a funzionare normalmente...c'è qualcosa che mi sfugge?
    vediamola questa query con il create table ...

    probabilmente sbagli nell'ordine con cui dichiari i campi. mi autoquoto:

    il prefisso della chiave primaria deve essere il tuo campo ed il suffisso auto increment
    prima dichiari il campo con il tuo valore, DOPO dichiari il campo che deve essere auto increment

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    codice:
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, 
    UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; 
    CREATE SCHEMA IF NOT EXISTS `videonoleggio` DEFAULT CHARACTER SET latin1 ; 
    
    CREATE TABLE IF NOT EXISTS `videonoleggio`.`CopiaNoleggio` 
    ( `Film` MEDIUMINT NOT NULL , 
      `idCopia` MEDIUMINT NOT NULL AUTO_INCREMENT ,
      `Supporto` VARCHAR(45) NOT NULL , 
        PRIMARY KEY (`idCopia`, `Film`) ,
        INDEX `fk_Film_idFilm` (`Film` ASC) ,
        CONSTRAINT `fk_Film_idFilm` FOREIGN KEY (`Film` ) REFERENCES `videonoleggio`.`Film` (`idFilm` ) 
       ON DELETE NO ACTION 
       ON UPDATE NO ACTION) ENGINE = MyISAM; 
       SET SQL_MODE=@OLD_SQL_MODE; SET          FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET  UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    Questo è il codice ,fatto con l'aiuto di mysql workbench...

  10. #10
    Originariamente inviato da AlphaBishop
    Questo è il codice ,fatto con l'aiuto di mysql workbench...
    questo e' da utilizzare per le tabelle InnoDB che non supportano l'autoincrement con chiave multicolonna

    Per le tabelle MyISAM e' sufficiente la query suggerita, deve solo dichiarare prima il campo non incremntale. Direi quindi che non regge il "praticamente uguale" detto da las.

    codice:
    CREATE TABLE tabella(
         key1  INT NOT NULL ,
         key2  INT NOT NULL, AUTO_INCREMENT
         PRIMARY KEY (key1, key2)
    ) ENGINE=MyISAM;
    
    insert into tabella (key1)
    values (1), (1), (2), (2), (1), (1), (3);

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.