【问题标题】:Trying to add a constraint that makes the value on one column depending of another column's value in mysql试图添加一个约束,使一列上的值取决于mysql中另一列的值
【发布时间】:2020-10-16 10:00:35
【问题描述】:

在 MySQL 上,我对车辆表的“loueur_id”列进行的约束存在问题。我试图做到这一点,当列位置具有“disponible”或“en_revision”作为值时,“loueur_id”的值变为空,但如果“位置”的值为 NULL,则“loueur_id”值成为租车的客户



CREATE TABLE IF NOT EXISTS `vehicule` ( 
 `id` int NOT NULL AUTO_INCREMENT,
  `typ` int NOT NULL UNIQUE,
 `nb` int NOT NULL,
 `caract` json NOT NULL,
 `location` varchar(20),
 `photo` varchar(20) NOT NULL,
 `loueur_id` int, 
 PRIMARY KEY (`id`),
 INDEX per_loueur (`loueur_id`),
 FOREIGN KEY(`loueur_id`) REFERENCES `client`(`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

ALTER TABLE `vehicule`
ADD CONSTRAINT CK_location CHECK ((`location` in('disponible', 'en_revision')))
ADD CONSTRAINT CK_loueur CHECK (`loueur_id` = CASE WHEN `location` in('disponible', 'en_revision' THEN NULL ELSE `loueur_id` END CASE));

这是我试图做的,但 mysql 说我在最后一个 Check 约束上犯了语法错误。有人可以帮我找到问题的解决方案吗?

【问题讨论】:

  • end case???那是什么?第二个约束逻辑什么都不做,因为check 约束允许NULL 值。
  • 既然做了CASE声明,就写了“end case”来结束它。第二个限制是将 NULL 放在“loueur_id”而不是“location”上。

标签: mysql sql create-table check-constraints


【解决方案1】:

使用布尔逻辑而不是case 表达式来表达约束通常更简单。我认为这可以满足您的要求:

alter table `vehicule`
    add constraint ck_location check ((location in('disponible', 'en_revision'))),
    add constraint ck_loueur   check (
        (location in('disponible', 'en_revision') and loueur_id is null)
        or (location is null and loueur_id is not null)
    )

请注意,检查约束仅从 MySQL 8.0.16 开始可用。在早期版本中,它们的解析没有错误,但实际上并未强制执行。

【讨论】:

  • 我尝试了您的解决方案,但又遇到了另一个错误,但这次它说“loueur_id”不能用于检查约束,因为他已经用于外键约束。是版本问题还是无法在检查约束中使用外键?
【解决方案2】:

你可以通过一个约束来做到这一点:

alter table `vehicule`
    add constraint ck_vehicule_location_loueur_id
        check ( (location in ('disponible', 'en_revision') and loueur_id is null) or
                (location is null and loueur_id is not null)
              );

【讨论】:

  • 当我尝试你的代码时,我遇到了错误 3823,它说我不能在检查约束中使用“loueur_id”,因为在外键约束中需要它
  • @Alexis 。 . .唉,这是 MySQL 的限制。您必须在检查约束和外键约束之间进行选择。
  • 那么我想做的事,用MySQL基本上是不可能的?
  • 是的,我相信。
猜你喜欢
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多