2011-12-07 22 views
6

Ho una tabella in cui ho alcune colonne a,b,c e per ogni colonna c'è un'altra colonna, ad esempio, (x,y,z) che dipende rispettivamente da a,b,c.crea il vincolo di tabella in mysql

x,y,z avrà valore 1 se a,b,c ha qualsiasi valore e conterrà null se a,b,c has null.

Per un esempio Diciamo, I valori memorizzati in a è 2 e x è la colonna da essa dipendenti. Quindi x avrà valore come 1.

Se i valori memorizzati nella a è null poi x avrà valore null.

quindi c'è un modo in cui possiamo dichiarare questo vincolo al momento della creazione della tabella.

Si prega di suggerire qualcosa di diverso dai trigger.

+0

ragazzi grazie per le risposte, ma si prega di suggerire qualsiasi cosa diversa dai trigger, perché ho letto che possiamo mettere alcuni vincoli nella tabella create .. –

+0

No, non è possibile. A differenza della maggior parte degli altri DBMS (Postgre, Oracle, SQL Server ...) MySQL non supporta i vincoli di controllo. –

risposta

7

Se lo scopo di x, y e z è quello di semplificare alcune query quindi, piuttosto che dover x, y e z come colonne di vostra tavola si potrebbe anche considerare l'utilizzo al fine di fare questo per esempio

create view myview as 
    select a, b, c, 
    if (isnull(a), null, 1) as x, 
    if (isnull(b), null, 1) as y, 
    if (isnull(c), null, 1) as z 
    from mytable; 

e quindi basare le altre query su questa vista anziché direttamente sul tavolo.

+0

Hey grazie per la tua risposta, ma in quel tavolo ci sono molti posti in cui si inseriscono gli inserimenti, è un'applicazione enorme e stiamo avendo due piattaforme diverse ... –

+0

Puoi per favore elaborare l'approccio, o fornire un riferimento a questo Questo. –

+0

Ciao. Quale bit non è chiaro? La documentazione di MySQL sulle viste è [qui] (http://dev.mysql.com/doc/refman/5.6/en/views.html). – mikej

1

MySQL non gestisce CONSTRAINTS per-sé, ma si potrebbe implementare un comportamento simile utilizzando un TRIGGER sulle BEFORE INSERT e BEFORE UPDATE eventi. Dovrai, comunque, fare affidamento su altri vincoli a livello di tabella (NOT NULL) per farlo funzionare, come da this other question on SO.

Nel tuo caso specifico, sembra molto che tu voglia utilizzare il trigger per calcolare il valore dei tuoi valori x, y, z nel trigger, piuttosto che utilizzarlo per impedire l'inserimento di dati con valori "impropri" - ma la tua domanda non chiarisce questo punto inequivocabilmente, quindi dipende da cosa vuoi veramente.

1

Sì, è possibile utilizzare triggers per questo.

Dal capitolo Trigger syntax:

Se un trigger prima non riesce, l'operazione sulla riga corrispondente non viene eseguita

Anche se lo scenario che descrivi implica che i dati non sono normalizzati.

1

Inoltre vincoli, si potrebbe ottenere un risultato simile non immagazzinati a tutte le x, y, colonne z e con una vista:

CREATE VIEW myView AS 
SELECT 
    a, b, c, 
    (a = a) AS x, 
    (b = b) AS y, 
    (c = c) AS z 
FROM myTable 
4

Il vincolo che cerchi è il vincolo di controllo.

CREATE TABLE test 
(
    a varchar(10), 
    b varchar(10), 
    c varchar(10), 
    x integer, 
    y integer, 
    z integer, 
    CONSTRAINT chk_X_Nulls CHECK ((a is null and x is null) or (a is not null and x = 1)), 
    CONSTRAINT chk_Y_Nulls CHECK ((b is null and y is null) or (b is not null and y = 1)), 
    CONSTRAINT chk_Z_Nulls CHECK ((c is null and z is null) or (c is not null and z = 1)) 
); 

Purtroppo questo non è implementato in MySQL. C'è uno open bug report che risale al 2004 per questa funzione, quindi non aspettarti di vederlo presto.

Altri hanno risposto che è possibile utilizzare trigger o visualizzazioni per ottenere il risultato desiderato e queste sono le risposte corrette per MySQL.

È possibile anche parzialmente limitare i dati utilizzando alcuni trucchi semplici:

  • Impostare il tipo di dati di x, y, z-enum('1'). Ciò impedirà l'inserimento di valori diversi da null e '1' ma non garantisce che i valori siano corretti.
  • Se a, b, c hanno una gamma limitata di possibili valori è possibile creare vincoli di chiave ad altre tabelle e popolare quei tavoli con ogni possibile valore della a, b, c
  • È possibile creare un event per aggiornare x, y, z su un programma (ad esempio una volta ogni ora o una volta al giorno). I valori per x, y, z possono essere corretti se hanno torto.

si può vedere la restrizione di controllo in azione con PostGreSQL here

Se avete bisogno di ulteriori consigli si prega di spiegare perché i trigger sono inadeguate per il vostro compito.

Problemi correlati