存储As()在Laravel中生成的列(MySQL)中的错误

Posted

技术标签:

【中文标题】存储As()在Laravel中生成的列(MySQL)中的错误【英文标题】:Error in generated column (MySQL) in Laravel by storedAs() 【发布时间】:2019-05-14 07:00:54 【问题描述】:

这是我的迁移脚本

Schema::create('orders', function (Blueprint $table) 
            .
            .
            .
            $table->decimal('coupon_discount')->default(0);
            $table->decimal('delivery_charge')->default(0);
            $table->decimal('sub_total')->default(0);
            $table->decimal('total')->storedAs('(sub_total + delivery_charge) - coupon_discount');
            $table->decimal('paid')->default(0);
            $table->decimal('due')->storedAs('total - paid');
            $table->longText('note')->nullable();
            .
            .
            .
            $table->timestamps();
        );

我必须为总计和到期列创建generated-columns。

但是当我尝试运行迁移文件时,它显示异常

例外:

Illuminate\Database\QueryException : SQLSTATE[42000]: 语法错误 或访问冲突:1064 您的 SQL 语法有错误;查看 与您的 MariaDB 服务器版本相对应的手册 在 'stored, paid decimal(8, 2) not null 附近使用的正确语法 默认 '0', due decimal(8, 2) as (total' at line 1 (SQL:

create table orders (
    id int unsigned not null auto_increment primary key, 
    user_id int unsigned null, 
    area_id int unsigned not null, 
    location_id int unsigned not null, 
    delivery_add ress longtext not null, 
    delivery_address_id int unsigned null, 
    mobile varchar(191) not null, 
    email varchar(191) null, 
    coupon_id int unsigned null, 
    coupon_discount decimal(8, 2) not null default '0', 
    delivery_charge decimal(8, 2) not null default '0 ', 
    sub_total decimal(8, 2) not null default '0', 
    total decimal(8, 
    2) as ((sub_total + delivery_charge) - coupon_discount) stored, 
    paid decimal(8, 2) not null default '0', 
    due decimal(8, 
    2) as (total - paid) stored, 
    note longtext null, 
    order_type tin yint not null, 
    delivery_type tinyint not null, 
    status smallint not null default '0', 
    payment_method tinyint not null, 
    payment_channel smallint null, 
    payment_status tinyint not null default '0', 
    created_at timestamp null, 
    updated_at timestamp null
) default character set utf8mb4 collate 'utf8mb4_unicode_ci'
)

注意:我有 mysql Ver 15.1 Distrib 10.1.35-MariaDB,适用于 Win32

我错过了什么?

【问题讨论】:

您的错误消息说您使用的是 MariaDB,而不是 MySQL。您使用的是什么版本的 MariaDB,因为可能并不总是支持生成的列? 可以直接对MariaDB执行相应的create table语句吗?如果你不能,那么至少你会知道这不是 php 的问题。 它在 mysql 中工作.. 我有 mysql Ver 15.1 Distrib 10.1.35-MariaDB,适用于 Win32 (AMD64) @TimBiegeleisen STORED 关键字需要 MariaDB 10.2.1+:mariadb.com/kb/en/library/generated-columns 【参考方案1】:

[已解决]

这是我的 MariaDB 版本问题,而不是 PHP

将 MariaDB 10.1 升级到 10.3。现在它工作正常。

遵循here的解决方案

感谢乔纳斯、萨钦、蒂姆

【讨论】:

STORED 在 MariaDB 10.2 之前不可用。

以上是关于存储As()在Laravel中生成的列(MySQL)中的错误的主要内容,如果未能解决你的问题,请参考以下文章

缓存/存储在 datapower 中生成的 LTPA 令牌

使用 JDBC PreparedStatement 返回 MySql 中生成的键

无法存储通过搜索文本框在硒列表中生成的下拉列表项

基本路由在 Laravel 中生成 404

使用 MySQL,如何在表中生成包含记录索引的列?

撤销/使 .boto 文件(gsutil config)中生成的 oauth2 刷新令牌无效