我有这段代码,我想在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')
);
答案 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)
);