[Risolto][Mysql] Unique condizionato da valore.

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

[Risolto][Mysql] Unique condizionato da valore.

Messaggio da SuperStep »

Salve,

Ho un altro problema sul campo unique:

supponendo di avere una tabella formata da questi campi:

Codice: Seleziona tutto

+ id  Integer PrimaryKey
+ nome String
+ deleted Boolean
vorrei creare una condizione di unicita' sul nome solamente se 'deleted' risulta false. (Nel senso che, possono esserci piu' tuple con nome uguali solo se sono stati cancellati, ma non piu' tuple con nome uguali non cancellati).

non posso mettere unique in contemporanea su 'nome' e 'deleted' altrimenti non potrei avere piu' cancellati sullo stesso nome.

Adesso so che esiste la clausola CHECK di mysql, ma utilizzando il framework laravel non riesco a trovare il modo di implementarla sullo Schema Builder.

Nel caso volessi utilizzare l'oggetto DB per mettere la clausola a mano, quale sarebbe la corretta sinstassi per fare questo?

Grazie.
Ultima modifica di SuperStep il giovedì 7 maggio 2015, 16:23, modificato 1 volta in totale.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [Mysql] Unique condizionato da valore.

Messaggio da ienaplinsky »

Provato con qualcosa del genere?

Codice: Seleziona tutto

check not exists (select * from table a where a.deleted = false and exists select * from table b where a.nome = b.nome)
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Mysql] Unique condizionato da valore.

Messaggio da Zoff »

Se la CHECK non va bene la cosa migliore è crearsi un TRIGGER su INSERT e UPDATE che verifica la condizione
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: [Mysql] Unique condizionato da valore.

Messaggio da SuperStep »

ho deciso che mettero la logica di controllo nell'applicazione e non nel database... questa cosa non mi riesce bene.

Grazie, metto risolto.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [Risolto][Mysql] Unique condizionato da valore.

Messaggio da ienaplinsky »

Seguendo il suggerimento di zoff ho provato questo sembrerebbe funzionare

Codice: Seleziona tutto

DROP TRIGGER IF EXISTS  check_name_deleted;
DELIMITER //
CREATE TRIGGER check_name_deleted BEFORE INSERT ON `user`
 FOR EACH ROW BEGIN
    DECLARE msg varchar(255);
        IF (SELECT COUNT(*) FROM user as a WHERE a.deleted = 0 
                          and exists (select * from user as b where a.nome = b.nome)) > 0 THEN
        SET msg = 'Constraint violato: non possono esserci duplicati ';
        SIGNAL sqlstate '45000' SET message_text = msg;
        END IF;
    END //
DELIMITER ;
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [Risolto][Mysql] Unique condizionato da valore.

Messaggio da ienaplinsky »

come non detto non iserisce niente mi dispiace, ora vedo se lo riesco ad aggiustare :p
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [Risolto][Mysql] Unique condizionato da valore.

Messaggio da ienaplinsky »

c'era un piccolo errore ora dovrebbe andare

Codice: Seleziona tutto

DROP TRIGGER IF EXISTS check_name_deleted;
DELIMITER //
CREATE TRIGGER check_name_deleted  BEFORE INSERT ON `user`
 FOR EACH ROW BEGIN
    DECLARE msg varchar(255);
        IF (SELECT COUNT(*) FROM user as a WHERE a.deleted = 0 
                          and exists (select * from user as b where a.nome = b.nome and a.id <> b.id) > 0)  THEN
        SET msg = 'Constraint violato: non possono esserci duplicati ';
        SIGNAL sqlstate '45000' SET message_text = msg;
        END IF;
    END //
DELIMITER ;
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: [Risolto][Mysql] Unique condizionato da valore.

Messaggio da SuperStep »

grazie @ienaplinsky, proverò ad implementarlo :)

Grazie di avermi aiutato!
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: [Risolto][Mysql] Unique condizionato da valore.

Messaggio da ienaplinsky »

scusami mi sono accorto che c'era ancora un errore, questo dovrebbe fare quello che intendevi tu

Codice: Seleziona tutto

CREATE TRIGGER check_name_deleted AFTER INSERT ON `user`
 FOR EACH ROW BEGIN
    DECLARE msg varchar(255);
        IF (SELECT COUNT(*) FROM user AS a WHERE EXISTS (SELECT * FROM user AS b where a.nome = b.nome AND a.id <> b.id AND a.deleted = 0 AND b.deleted = 0) > 0)  THEN
        SET msg = 'Constraint violato: non possono esserci duplicati ';
        SIGNAL sqlstate '45000' SET message_text = msg;
        END IF;
    END
l'altro faceva inserire e poi violava il vincolo perchè prima di inserire il doppione non c'è, ora con after insert prima inserisce e poi controlla il doppione
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: [Risolto][Mysql] Unique condizionato da valore.

Messaggio da SuperStep »

veramente accurato! Grazie!
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti