我正在 Rails 中设置我的生产数据库。开发使用 SQlite,生产使用 MySQL。
在迁移过程中,对于所有具有默认值的十进制列,我都收到了一个无效默认值错误。这是一个例子。
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
我环顾四周,无法弄清楚这里出了什么问题。
非常感谢。
最佳答案
在用 precision 2
和 scale 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
关于Rails 迁移过程中默认十进制值的 MySQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23787773/