Clausola check | SQL & MySQL

Topic: Pubblico - Composto da 4 Posts di 2 Utenti.

12 Agosto, 2011 20:05 #1
Guccio
Utente

Guccio
Registrato: Aug, 2011
Posts: 4
Offline

Buonasera a tutti,
E' da stamane che sto sbattendo la testa su un errore di sintassi sulla clausola check.
Posto il codice:

 1CREATE TABLE `Users` (
 2  `Id_mail` varchar(20) NOT NULL DEFAULT '',
 3  `Family_name` varchar(60) NOT NULL,
 4  `Name` varchar(50) NOT NULL,
 5  `Sex` char(1) NOT NULL,
 6  `Birthday` date NOT NULL,
 7  `Cap` smallint(5) DEFAULT NULL,
 8  `Address` varchar(60) DEFAULT NULL,
 9  `N_civic` smallint(5) unsigned DEFAULT NULL,
10  `Category` char(1) check(Category = 'I' or Category = 'N' or Category = 'D')
11  PRIMARY KEY (`Id_mail`)
12) ENGINE=InnoDB DEFAULT CHARSET=latin1cun

Qualcuno mi aiuti per favore.
Ringrazio in anticipo

13 Agosto, 2011 00:43 #2
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

MySQL non supporta quel tipo di vincoli.
Dovrebbe accettare la sintassi CHECK per compatibilità con gli altri dbms, ma in pratica non fa nulla. (tu dirai: e allora che compatibilità è? hai ragione)

Però puoi usare una vista. Sono stanco e potrei sbagliare la sintassi, ma l'importante è che tu capisca il senso:

1CREATE ALGORITHM = MERGE VIEW users_view AS (
2SELECT * FROM users WHERE Category = 'I' or Category = 'N' or Category = 'D'
3) WITH LOCAL CHECK OPTION;

Praticamente crei una vista che corrisponde alla tabella. Puoi inserirci dei dati, ma siccome c'è la CHECK OPTION, i record vengono accettati solo se soddisfano la WHERE.
L'algoritmo MERGE evita che la vista generi una tabella temporanea, che è inutile dato che la vista verrà usata solo per gli inserimenti (le SELECT è meglio farle sulla tabella).
La parola LOCAL serve solo a evitare un controllo in più, che comunque in questo caso non avrebbe effetto.

Spero di essere stato chiaro.

13 Agosto, 2011 11:01 #3
Guccio
Utente

Guccio
Registrato: Aug, 2011
Posts: 4
Offline

Ciao Fuser ti ringrazio per la risposta.
Conosco le viste ma mi sfugge

1CREATE ALGORITHM = MERGE VIEW
(non c'è un altro modo in cui si possa fare?) e non riesco a trovare un manuale dove sia spiegata. Saresti così gentile da delucidarmi o indicarmi qualche manuale che sia piuttosto esaustivo?
Ringrazio in anticipo.

13 Agosto, 2011 13:49 #4
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

http://dev.mysql.com/doc/refman/5.1/en/create-view.html

Nella maggior parte dei casi è inutile, se non ti convince toglilo.

Condividi su:

Loggati o Registrati per replicare