2010-07-12 19 views

risposta

10

Piuttosto che avere l'attributo booleano nella tabella, si potrebbe avere un'altra tabella che contiene una riga e punta alla riga nella tabella originale che si considera vera.

La modifica del valore vero è una questione di aggiornamento della chiave esterna nella tabella TrueRow.

+0

Sì. E sarebbe possibile utilizzare un vincolo di controllo per garantire che esista solo una riga (utilizzando la tecnica di Celko qui http://www.sqlmonster.com/Uwe/Forum.aspx/ms-sql-server/3453/How-to-Modify-a-views-SQL-source-from-a-program) –

+0

esattamente quello che ho scritto sul mio commento - ma non sappiamo se è possibile riprogettare lo schema SQL. Il problema è definitivamente problem-by-design. Comunque questo è già stato discusso ... – Erik

+0

Grazie Gilbert & Erik. Cambiare schema è una possibilità, quindi vorrei seguire questo approccio. – Reddy

1
  1. una colonna specifica può solo prendere valori "true" o "false".

    Uso tipo di dati per la colonna sia boolean o tiny-int

2 ed esattamente una sola riga deve essere avere valore 'true'?

si deve scrivere una query che aggiornano tutte le colonne delle righe è false tranne uno si imposta su true

+0

per (2), io voglio che sia come vincolo (simile al uniche, vincoli di chiave primaria) – Reddy

1

Impostare il tipo di dati della colonna "boolean"; quindi aggiungi una funzione trigger, che imposta la riga che vuoi essere sempre "true" su true durante l'aggiornamento.

+0

Grazie trigger è una buona opzione, ma non abbiamo altre opzioni? – Reddy

+0

Io non la penso così; non è possibile impostare un blocco di colonna su una singola riga per impedire gli aggiornamenti. Qualsiasi tipo di indice UNIQUE inoltre non funzionerà, poiché tutte le altre false-voci genererebbero un'eccezione di chiave duplicata. Solo se si utilizzano stored procedure o viste per modificare la tabella, è possibile applicarla qui. Se la tabella viene utilizzata direttamente, penso che il trigger sia l'unica opzione. Un'altra soluzione potrebbe essere quella di estrarre la colonna in un'altra tabella e unirsi a questa tabella. Ma non sono in grado di controllarlo, perché non so cosa stai facendo esattamente. – Erik

2

In MySQL, un indice univoco ignorerà tutti i valori NULL. Quindi c'è un po 'di trucco che potresti usare.

Si potrebbe considerare l'aggiunta di un bit colonna Null (che può avere solo il valore 1 o 0):

ADD COLUMN `is_default` BIT NULL; 
ADD UNIQUE INDEX `is_default_UNIQUE` (`is_default` ASC); 

A questo punto, una riga può essere 1 (VERO), e il tentativo di aggiungere un'altra riga che è anche vero, si tradurrà in un errore:

1062: Duplicate entry '\x01' for key 'is_default_UNIQUE' 

L'unico problema è che tutte le altre righe devono essere NULL e non possono essere false come quella sarebbe anche contare come un valore unico.

Example table data

(Questo non è proprio quello che gli indici sono destinati ad essere utilizzati per se)

Problemi correlati