Sql 约束错误引用了其他列

Sql constraint error references other column

我不太了解 mysql,我的 sql 脚本中有一个错误。当前 运行 mysql 8.0.24。有谁知道可能是什么问题?

错误: https://prnt.sc/226xk5x

Sql:

-- Dumping structure for table gtav_rp2._vehicle


CREATE TABLE IF NOT EXISTS `_vehicle` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `cid` int(11) unsigned NOT NULL,
      `vin` varchar(50) NOT NULL DEFAULT '',
      `type` varchar(50) NOT NULL DEFAULT '',
      `size` int(11) NOT NULL,
      `plate` varchar(50) NOT NULL DEFAULT '',
      `model` varchar(50) NOT NULL DEFAULT '',
      `name` varchar(50) DEFAULT NULL,
      `garage` varchar(59) DEFAULT NULL,
      `state` varchar(50) DEFAULT NULL,
      `appearance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid('appearance')),
      `mods` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid('mods')),
      `data` longtext DEFAULT NULL,
      `damage` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid('damage')),
      `degredation` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid('degredation')),
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    -- Dumping data for table gtav_rp2._vehicle: ~0 rows (approximately)
    /*!40000 ALTER TABLE `_vehicle` DISABLE KEYS */;
    /*!40000 ALTER TABLE `_vehicle` ENABLE KEYS */;
    
    /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
    /*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
    /*!40101 SET CHARACTER

_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

您的 CHECK 约束没有引用该列。或者任何专栏,实际上。通过使用单引号,您使用的是字符串文字,而不是列名。

  `appearance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL 
    CHECK (json_valid('appearance')),

我认为这意味着:

  `appearance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL 
    CHECK (json_valid(`appearance`)),

Use the right type of quotes 用于 SQL 标识符,而不是字符串文字。

此外,如果您使用 JSON data type 而不是 LONGTEXT,则不需要此 CHECK 约束。 JSON 数据类型已经强制列的内容必须是有效的 JSON 格式。

MySQL的JSON数据类型已经使用utf8mb4字符集和utf8mb4_bin排序规则。

所以您的列定义可以简单如下:

  `appearance` JSON