对值的SQL约束不起作用

时间:2014-03-21 13:14:37

标签: mysql constraints

我试图将列限制为特定值,没有运气 这是我一直在尝试的:

mysql> CREATE TABLE my_table (
    -> name VARCHAR(20),
    -> sex CHAR(1) CHECK (sex IN('F','M'))
    -> );
Query OK, 0 rows affected (0.18 sec)

mysql> INSERT INTO my_table VALUES
    -> ('John','D');
Query OK, 1 row affected (0.07 sec)

mysql> SELECT * FROM my_table;
+------+------+
| name | sex  |
+------+------+
| John | D    |
+------+------+
1 row in set (0.00 sec)

mysql> 

如您所见,约束未得到强制执行......

3 个答案:

答案 0 :(得分:1)

这是因为CHECK clause is parsed but ignored by all storage engines.

您可以为其创建触发器,以便在插入开始之前检查“性别”列的值。

试试这样:

DELIMITER $$
CREATE TRIGGER `mytrigger` BEFORE INSERT ON `Table`
FOR EACH ROW
BEGIN
    IF SEX <> 'M' or SEX <> 'F' THEN
    SIGNAL SQLSTATE '123'
        SET MESSAGE_TEXT := 'check constraint on Table.Sex failed';
    END IF;
END$$   
DELIMITER ; 

答案 1 :(得分:0)

您可以使用外键约束在没有触发器的情况下执行此操作:

CREATE TABLE sexes (
  sex char(1) not null primary key
);

INSERT INTO sexes(sex)
    select 'F' union all select 'M';

CREATE TABLE my_table (
  name VARCHAR(20),
  sex CHAR(1) not null references sexes(sex)
);

您可能还有其他原因需要代码表。例如,您可能希望存储代码的全名。

MySQL中的另一种方法是为值使用枚举类型。

答案 2 :(得分:0)

使用引用约束替换检查约束。将引用约束添加到某个表中,该表包含一行用于male,一行用于female。使用此方法可获得一个奖励。您可以在以后添加更多性别来处理像地球蠕虫这样的病例。

CREATE TABLE your_table
(
name varchar(20),
gender char(1),
CONSTRAINT fk_sez FOREIGN KEY (gender)
REFERENCES sezs(gender)
)

Here's a google search for foreign key constraints tutorial