Emulare la clausola CHECK in MariaDB

English version

MariaDB (come MySQL e i suoi fork) non supporta la clausola CHECK dell’istruzione CREATE TABLE. Ma si può emularla con una vista.

DDL

Per prima cosa, creiamo una tabella:

CREATE TABLE `t_person`
(
	`id`       INTEGER UNSIGNED NOT NULL AUTO_INCREMENT ,
	`name`     CHAR(30) NOT NULL ,
	`surname`  CHAR(30) NOT NULL ,
	`email`    CHAR(50) NOT NULL ,
	PRIMARY KEY (`id`)
);

La tabella è pronta per ricevere i dati, ma vogliamo controllare che questi siano validi. Quando si inserisce una nuova riga, vogliamo controllare che `surname` (cognome) contenga almeno 2 caratteri e che `email` contenga ‘@’ e ‘.’.

Quindi passiamo a creare una vista, che mostra solo i dati che seguono queste due semplici regole:

CREATE VIEW `person`
	AS SELECT * FROM `t_person`
		WHERE LENGTH(`surname`) > 1
			AND `email` LIKE '%_@_%._%'
	WITH CHECK OPTION;

La vista è INSERTable, perché è costruita su un’unica tabella fisica e non contiene funzioni aggreganti o raggruppamenti. La clausola WITH CHECK OPTION fa in modo che le nuove righe vengano rifiutate se non soddisfano la condizione WHERE.

DML

Ora possiamo provare a inserire dati nella vista. Iniziamo con ua riga non valida:

INSERT
	INTO `person`
		(`name`, `surname`, `email`)
	VALUES
		('Mario', 'Rossi', 'mario.rossi');

`email` non contiene il catattere ‘@’, perciò la riga viene respinta con il seguente messaggio di errore:
[Err] 1369 - CHECK OPTION failed 'test.person'

Ora proviamo a inserirne una valida:

INSERT
	INTO `person`
		(`name`, `surname`, `email`)
	VALUES
		('Mario', 'Rossi', 'mario.rossi@rossionline.it');

La riga viene inserita con successo!

E’ possibile effettuare le SELECT sulla tabella `t_person` oppure su `person`, come si preferisce. Se si usa `person`, si può fingere che la vista sia una tabella e che `t_person` non esista – è assolutamente trasparente. Tuttavia, eseguendo le SELECT su `person` viene aggiunta una WHERE che è sempre vera ma influenza leggermente le prestazioni.

A presto!

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...