【问题标题】:Sql constraint error references other columnsql约束错误引用其他列
【发布时间】:2022-01-12 20:04:57
【问题描述】:

我对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 */;

【问题讨论】:

    标签: mysql sql check-constraints mysql-json


    【解决方案1】:

    您的 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
    

    【讨论】:

    • 谢谢,我尝试了一些东西,但没有想到在字段周围切换东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多