Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [MySQL] Vincolo su due colonne

    Buongiorno a tutti... Dovendo realizzare un semplice db per un cloud mi sono trovato difronte al seguente problema:Ho una tabella del tipo
    codice:
    CREATE TABLE TABELLA(
    numero1 INT NOT NULL,
    numero2 INT NOT NULL,
    PRIMARY KEY (numero1, numero2))
    ENGINE = InnoDB;
    Quando inserisco con:
    codice:
     INSERT INTO TABELLA (numero1, numero2) VALUES (1, 2);
    va ovviamente tutto ok... Vorrei però che quando successivamente provi ad effettuare l'inserimento con i valori invertitti, ovvero:
    codice:
     INSERT INTO TABELLA (numero1, numero2) VALUES (2,1);
    venisse generato un errore... Adesso non ricordo di preciso che tipo di vincolo bisogna impostare, pensavo bastasse PRIMARY KEY sui due campi ma a quanto pare no... Qualcuno ha la soluzione? Chiedo perchè ho provato a cercare ma evidentemente non so cosa cercare. Grazie in anticipo!

  2. #2
    Prova con UNIQUE non so se "vede" anche i valori invertiti.

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    (2 e 1) e (1 e 2) sono sempre due cose diverse a livello di una tabella. Se vuoi fare scattare un errore lo devi programmare.

    Comunque mezza idea ce l'avrei (ma non sono abbastanza ferrato in matematica per esserne sicuro). Aggiungi un campo. Poi crei un indice su quel campo che definisci come UNIQUE. E dentro metti il valore log(a)*log(b). a è il primo valore, b è il secondo.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Se ho capito quello che vuoi fare mi sa non funziona perchè log(a)*log(b) = log(a+b) però ci sono combinazioni diverse che sommate danno lo stesso numero [3+6][4+5][8+1] ecc. Poi magari ho capito male XD
    Sennò ti fai una sorta di trigger dove ti fai una tabella temporanea con le colonne invertite e controlli sia sulla normale che su quella invertita.

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da Onizuka8 Visualizza il messaggio
    Se ho capito quello che vuoi fare mi sa non funziona perchè log(a)*log(b) = log(a+b) però ci sono combinazioni diverse che sommate danno lo stesso numero [3+6][4+5][8+1] ecc. Poi magari ho capito male XD
    Sennò ti fai una sorta di trigger dove ti fai una tabella temporanea con le colonne invertite e controlli sia sulla normale che su quella invertita.
    Ho specificato che la matematica non è il mio forte.
    Comunque : concat(greatest(a,b),'-',least(a,b)) messo in un campo UNIQUE dovrebbe andare.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    è sbagliata proprio la logica

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da MySQL Visualizza il messaggio
    è sbagliata proprio la logica
    Cioè ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    cioè quando scrivi su una chiave primaria devi già sapere che andrà a buon fine.
    provare a scrivere per poi intercettare errore di duplicazione non ha un gran senso.

  9. #9
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da MySQL Visualizza il messaggio
    cioè quando scrivi su una chiave primaria devi già sapere che andrà a buon fine.
    provare a scrivere per poi intercettare errore di duplicazione non ha un gran senso.
    Sono d'accordo con te. Comunque è quello che chiede.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  10. #10
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Sono d'accordo con te. Comunque è quello che chiede.
    OK, posto che la richiesta è logicamente sbagliata, può fare un trigger che BEFORE INSERT ordini numero1 e numero2, ad esempio in forma crescente, per inserirli nell'ordine che hanno.
    Ragionevolezza: 0

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.