当创建表mysql失败时进行约束


Constrain when create table mysql failure

我是php和mysql的新手,我想将用户输入限制为特定值。例如,Type只能是M或C,而不能是其他类型。因此,我使用以下代码在数据库hactl下创建一个表1。

/**********************************************************************/
/*Create database and table*/
CREATE DATABASE Hactl;
CREATE TABLE  Hactl.table1(
    Type VARCHAR(1) NOT NULL,
    Region VARCHAR(50) NOT NULL,
    Country VARCHAR(50) NOT NULL,
    City VARCHAR(3) NOT NULL,
    Imp DECIMAL(10,2) NOT NULL,
    Exp DECIMAL(10,2) NOT NULL,
    TS DECIMAL(10,2) NOT NULL,
    Year INT(4) NOT NULL,
    Month VARCHAR(3) NOT NULL,
    CONSTRAINT chk_hactl CHECK(Type IN ('M','C') AND
                   Month IN ('Jan', 'Feb', 'Mar', 
                         'Apr', 'May', 'Jun',
                         'Jul', 'Aug', 'Sep',
                         'Oct', 'Nov', 'Dec')
                  )
);

当我插入一个Type=K的新行时,它仍然可以成功插入。

要重新限制其他条目,只需使用ENUM

CREATE TABLE  Hactl.table1(
Type enum('M','C') NOT NULL,
Region VARCHAR(50) NOT NULL,
Country VARCHAR(50) NOT NULL,
City VARCHAR(3) NOT NULL,
Imp DECIMAL(10,2) NOT NULL,
Exp DECIMAL(10,2) NOT NULL,
TS DECIMAL(10,2) NOT NULL,
Year INT(4) NOT NULL,
Month enum('Jan', 'Feb', 'Mar', 
           'Apr', 'May', 'Jun',
           'Jul', 'Aug', 'Sep',
           'Oct', 'Nov', 'Dec') NOT NULL,
);

CONSTRAINT ... CHECK在MySQL中不是有效语法。请参阅此处的文档:http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

从语法上讲,您可以在CREATE TABLE中使用CHECK子句,但所有MySQL存储引擎都会忽略它,因为它不受支持。请注意文档中本页的注释The CHECK clause is parsed but ignored by all storage engines.:http://dev.mysql.com/doc/refman/5.6/en/create-table.html

通常,这种数据验证是通过使用ENUM字段类型来强制执行的。请参阅此处的文档:http://dev.mysql.com/doc/refman/5.6/en/enum.html