mysql忽略检查约束

mysql忽略检查约束,mysql,sql,Mysql,Sql,我有这段代码,我想在MySQL中实现它,但不支持CHECK。我该怎么做 CREATE TABLE Fare ( type_of_passenger varchar(20), price FLOAT, PRIMARY KEY (type_of_passenger), CHECK (lower(type_of_passenger)='child' OR lower(type_of_passenger)='student' OR lower(type_of_passen

我有这段代码,我想在MySQL中实现它,但不支持CHECK。我该怎么做

CREATE TABLE Fare (
    type_of_passenger varchar(20),
    price FLOAT,
    PRIMARY KEY (type_of_passenger),
    CHECK (lower(type_of_passenger)='child' OR lower(type_of_passenger)='student' OR lower(type_of_passenger)='senior')
);

你确定你需要那张支票吗?由于主键是
type\u of_passenger
,因此您只能有三行。。这似乎太过分了

您可以插入这3行,然后继续。如果在外键中引用此字段,则仍将限制为表中的值

事实上,只要您使用更新限制和删除限制时使用的外键引用每个值,您无论如何都无法更改它们

我在这里看到的唯一有效问题是,您希望允许DB用户更改
价格
,而不是乘客的
类型

如果插入正确的(或存根)数据开始,则可以通过


N.B.我会在这里使用一个代理无符号整数primary并唯一化字符串描述,因此,如果我确实需要更改字符串,我可以毫不担心地进行更改,并且不会因为更新引用它的所有表而影响性能

看起来您真的在尝试实现一个
ENUM

type_of_passenger ENUM('child', 'student', 'senior')
默认情况下,MySQL不验证枚举值,因此如果您尝试存储其他内容,它将存储一个空字符串,但如果启用严格SQL模式,它将报告一个错误

另一种方法是将其作为输入有效值的表的外键

CREATE TABLE passenger_types (
    type VARCHAR(20) NOT NULL PRIMARY KEY
);
INSERT INTO passenger_types (type) VALUES
('child'), ('student'), ('senior');


CREATE TABLE Fare (
    type_of_passenger varchar(20),
    price FLOAT,
    PRIMARY KEY (type_of_passenger),
    CONSTRAINT FOREIGN KEY (type_of_passenger) REFERENCES passenger_types (type)
);

MySQL没有实现
check
约束。如果你真的想检查这个值,你需要一个触发器。你的检查允许同时有“CHild”、“CHild”等行。这就是你想要的吗?@philipxy其实不是。。MySQL不敏感地执行equals字符串比较大小写,因此类型为_的乘客的PK将只允许同时使用一个示例。检查中较低的()实际上是多余的(如果MySQL实现了检查),但实际上很好地表明=对字符串有效。@您的注释中没有任何内容与我的注释相矛盾--“实际上它没有”是错误的。我同意你的评论比我的评论更重要。我发表评论是为了解决支票中可能存在的错误推理。@philipxy Fair point,我道歉@philipxy我不知道你的意思