Mysql 如何允许列仅等于3个值中的1个

Mysql 如何允许列仅等于3个值中的1个,mysql,constraints,Mysql,Constraints,大家好,在学习mysql的时候,我在过去的一次考试中遇到了这个问题 关于每辆卡车到目前为止行驶的距离的信息没有 需要更长的时间。相反,我们希望存储有关 卡车的当前状态。状态可以是可用状态, 使用或维护 这个问题的状态部分是我有点卡住了。我解决这个问题的唯一方法是通过where子句或将字符串值设置在4和9之间。我刚才的另一个想法可能是使用检查约束?将状态移动到不同的表状态(id、名称),并将状态id存储在卡车中,作为指向其中一个的外键 status(1, 'available') status(2

大家好,在学习mysql的时候,我在过去的一次考试中遇到了这个问题

关于每辆卡车到目前为止行驶的距离的信息没有 需要更长的时间。相反,我们希望存储有关 卡车的当前状态。状态可以是可用状态, 使用维护


这个问题的状态部分是我有点卡住了。我解决这个问题的唯一方法是通过where子句或将字符串值设置在4和9之间。我刚才的另一个想法可能是使用检查约束?

将状态移动到不同的表状态(id、名称),并将状态id存储在卡车中,作为指向其中一个的外键

status(1, 'available')
status(2, 'used')
status(3, 'maintained')

最好的方法是创建一个包含可用状态的单独表,然后在
trucks
关系和
status
关系之间实现一个外键:

CREATE TABLE status (
    id INT NOT NULL PRIMARY KEY,
    description VARCHAR(32)
);

CREATE TABLE trucks (
    id INT NOT NULL PRIMARY KEY,
    status_id INT NOT NULL,
    INDEX idx_status_id (status_id),
    FOREIGN KEY (status_id)
        REFERENCES status(id)
);
有些人会说使用一种类型。然而,我(和我曾经合作过的许多其他DBA)个人讨厌枚举类型。使用枚举,您可以将数据从属于表元数据的位置移动,更新列表是一项非常昂贵的操作,很难从应用程序中获取所有可用值,您无法使用它存储其他信息,等等。

您可以创建:

枚举是一个字符串对象,其值从表创建时列规范中显式枚举的允许值列表中选择


MySQL不强制执行检查约束。我们可以在插入之前和更新之前创建触发器。触发器可以检查分配给
status
列的值(例如
如果NEW.status IN('Available'、'Used'、'mainted'),则
不执行任何操作,并允许语句继续,否则,引发异常以导致语句处理停止。另一种选择(假设InnoDB存储引擎)是为域表定义外键约束,其中包含一组有效值。然后,当我们尝试插入/更新状态值不正确的行时,将引发错误。为什么“介于4和9之间”-这是六个值?
CREATE TABLE t(
  id INT NOT NULL PRIMARY KEY,
  status ENUM('available','used', 'maintained')
);