我试图将列限制为特定值,没有运气 这是我一直在尝试的:
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>
如您所见,约束未得到强制执行......
答案 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)
)