【问题标题】:MySQL error for default value of decimal during Rails migrateRails 迁移期间默认十进制值的 MySQL 错误
【发布时间】:2014-07-10 08:47:30
【问题描述】:

我正在 Rails 中设置我的生产数据库。开发使用 SQlite,生产使用 MySQL。

在迁移过程中,对于所有具有默认值的十进制列,我都收到 Invalid default value 错误。这是一个例子。

ActiveRecord::StatementInvalid: Mysql2::Error: Invalid default value for 'retail_markup': CREATE TABLE `defaults` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `company_id` int(11), `styles_number_of_items_per_row` int(11), `created_at` datetime, `updated_at` datetime, `retail_markup` decimal(2,2) DEFAULT '2.0', `commission_rate` smallint DEFAULT 15) ENGINE=InnoDB

数据库架构如下:

 create_table "defaults", force: true do |t|
    t.integer  "company_id"
    t.integer  "styles_number_of_items_per_row"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.decimal  "retail_markup", precision: 2, scale: 2, default: 2.0
    t.integer  "commission_rate", limit: 2, default: 15
  end

我环顾四周,无法弄清楚这里出了什么问题。

提前非常感谢。

【问题讨论】:

    标签: mysql ruby-on-rails sqlite rake dbmigrate


    【解决方案1】:

    您不能在使用precision 2scale 2 定义的十进制字段上使用默认值2.0

    通过将比例定义为 2,2.0 将变为 2.00,这需要 3 个有效数字来保存它。

    如果您的零售标记只有一位小数,请将您的定义更改为:

    t.decimal  "retail_markup", precision: 2, scale: 1, default: 2.0
    

    或者,如果您需要保留 2 位小数,请将您的定义更改为:

    t.decimal  "retail_markup", precision: 3, scale: 2, default: 2.00
    

    【讨论】:

    • 感谢您了解 Graeme。我犯了一个愚蠢的错误。
    • 不用担心 - 很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多