MySQL忽略检查约束

时间:2018-10-10 22:49:24

标签: 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_passenger)='senior')
);

2 个答案:

答案 0 :(得分:1)

确定要检查吗?由于主键是type_of_passenger,因此您将只能拥有三行。

您只需INSERT这三行然后继续。如果您在外键中引用此字段,则无论如何您将只能使用表中的值

实际上,一旦您使用外键引用每个值,而该外键使用ON UPDATE RESTRICT和ON DELETE RESTRICT,则无论如何都将无法更改它们

我在这里看到的唯一有效的担忧是您想允许数据库用户更改price而不是type_of_passenger

如果INSERT首先要使用正确的(或存根)数据,则可以通过permissions控制表和列的访问

NB 我将在此处使用代理无符号整数主变量,并且对字符串描述进行唯一化,因此,如果我确实需要更改字符串,则可以不用担心,也不会影响更新所有字符串。引用它的表

答案 1 :(得分:1)

您似乎真的在尝试实现ENUM

type_of_passenger ENUM('child', 'student', 'senior')

默认情况下,MySQL不验证ENUM值,因此,如果您尝试存储其他内容,它将存储一个空字符串,但是如果启用了严格的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)
);