2010-06-12 22 views
1

Je suis tombé en panne avec un problème!Utilisation d'une contrainte de vérification dans MySQL pour contrôler la longueur de la chaîne

J'ai configuré ma première contrainte de vérification en utilisant MySQL, mais malheureusement j'ai un problème. Lorsque vous insérez une ligne qui échoue au test, la ligne est insérée de toute façon.

La structure:

CREATE TABLE user (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    uname VARCHAR(10) NOT NULL, 
    fname VARCHAR(50) NOT NULL, 
    lname VARCHAR(50) NOT NULL, 
    mail VARCHAR(50) NOT NULL, 
    PRIMARY KEY (id), 
    CHECK (LENGTH(fname) > 30) 
); 

L'instruction d'insertion:

INSERT INTO user VALUES (null, 'user', 'Fname', 'Lname', '[email protected]'); 

La longueur de la chaîne dans la colonne nomfich devrait être trop court, mais il est inséré de toute façon.

Je suis sûr que je manque quelque chose de fondamental ici.

Répondre

7

MySQL doesn't enforce CHECK constraints, on any engine.
Ce qui m'amène à demander, pourquoi déclareriez-vous la colonne fname en tant que VARCHAR (50), mais voulez-vous imposer qu'il ne peut comporter que 30 caractères?

Cela dit, la seule alternative est d'utiliser un déclencheur:

CREATE TRIGGER t1 BEFORE INSERT ON user 
FOR EACH ROW BEGIN 

    DECLARE numLength INT; 
    SET numLength = (SELECT LENGTH(NEW.fname)); 

    IF (numLength > 30) THEN 
    SET NEW.col = 1/0; 
    END IF; 

END; 
+0

Je veux que ce soit au moins 30 caractères (plus courte que vraiment, je viens de mettre dans 30 pour que ce scénario ne permettrait pas) , donc toutes les chaînes plus longues que cela seraient acceptées – ptrn

+1

Impossible de compiler même. – zgnilec