Mysql 将默认值设置为 json 类型的列

Dav*_*kam 11 mysql sql json create-table mysql-workbench

我听说 8.0.13 之前的 mysql 版本接受 json 类型列的默认值,所以我使用 cmd:

ALTER TABLE templates CHANGE COLUMN values JSON NOT NULL DEFAULT '{}' ;
Run Code Online (Sandbox Code Playgroud)

但收到错误:

Error Code: 1101. BLOB, TEXT, GEOMETRY or JSON column 'values' can't have a default value
Run Code Online (Sandbox Code Playgroud)

那么我该如何解决呢?

我正在使用 mysql 版本 8.0.19 和客户端工具 Workbench

GMB*_*GMB 16

文件说

BLOB、TEXT、GEOMETRY 和 JSON 数据类型只有在将值写为表达式时才可以分配默认值,即使表达式值是文字。

您可以通过用括号将字面值括起来来使默认表达式成为表达式:

ALTER TABLE templates CHANGE COLUMN values JSON NOT NULL DEFAULT ('{}') ;
Run Code Online (Sandbox Code Playgroud)

或者:

ALTER TABLE templates CHANGE COLUMN values JSON NOT NULL DEFAULT (JSON_OBJECT()) ;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于版本 8.0.13 - 之前,[例如版本 5.7](https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html#data-types -defaults-explicit),JSON 的默认值是不可能的。(“无法为 BLOB、TEXT、GEOMETRY 和 JSON 数据类型分配默认值。”) (20认同)
  • 实际上,我在 mysql 8.0.28 上也有同样的错误(不能有默认值#1011) (7认同)

小智 13

根据 laravel 文档:

$table->json('movies')->default(new Expression('(JSON_ARRAY())'));
Run Code Online (Sandbox Code Playgroud)

默认修饰符接受一个值或 Illuminate\Database\Query\Expression 实例。使用 Expression 实例将阻止 Laravel 将值括在引号中,并允许您使用数据库特定的函数。一种特别有用的情况是当您需要为 JSON 列分配默认值时

https://laravel.com/docs/8.x/migrations#default-expressions


小智 5

MySql 语法与 Oracle/Postgres 略有不同,因此要将 JSON_Array 作为默认值,查询将是 -

ALTER TABLE table_name ALTER column_name SET DEFAULT (JSON_ARRAY());
Run Code Online (Sandbox Code Playgroud)

进一步参考这里