【问题标题】:Ruby on Rails foreign key migration on MariaDB 10.0.20 Server does not applyMariaDB 10.0.20 服务器上的 Ruby on Rails 外键迁移不适用
【发布时间】:2015-11-27 22:56:13
【问题描述】:

我正在尝试在我的 Ruby on rails 项目上应用数据库迁移,该项目定义了引用和外键约束。

迁移本身在开发 Sqlite3 数据库以及使用 Aria 存储引擎的 MariaDB 服务器上运行良好。为了支持外键约束,我们在实时 MariaDB 10 服务器中使用 InnoDB(此处为:XtraDB)存储引擎。

在实时应用迁移时,它会失败并显示以下错误消息。

== 20150831210234 AddStyleToPiece: migrating ==================================
-- add_reference(:nv_pieces, :style, {:index=>true, :foreign_key=>true})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table storage engine 'InnoDB' does not support the create option 'TRANSACTIONAL=1': ALTER TABLE `nv_pieces` ADD `style_id` int(11)/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:305:in `query'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:305:in `block in execute'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract_adapter.rb:473:in `block in log'
/usr/local/rvm/gems/ruby-2.1.5/gems/activesupport-4.2.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract_adapter.rb:467:in `log'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:305:in `execute'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/mysql2_adapter.rb:231:in `execute'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract/schema_statements.rb:393:in `add_column'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/connection_adapters/abstract/schema_statements.rb:663:in `add_reference'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/migration.rb:662:in `block in method_missing'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/migration.rb:631:in `block in say_with_time'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/migration.rb:631:in `say_with_time'
/usr/local/rvm/gems/ruby-2.1.5/gems/activerecord-4.2.4/lib/active_record/migration.rb:651:in `method_missing'
/srv/httpd/rails-app/db/migrate/20150831210234_add_style_to_piece.rb:3:in `change'

我知道 MariaDB 服务器不支持 XtraDB 存储引擎的 TRANSACTIONAL。

这似乎是 mysql2 gem、libmariadbclient 和服务器之间的一致性问题,但我找不到生成语句的位置。

【问题讨论】:

    标签: mysql ruby-on-rails ruby foreign-keys mariadb


    【解决方案1】:

    TRANSACTIONAL 仅适用于 Aria 表。

    参考: https://mariadb.com/kb/en/mariadb/create-table/#transactional

    所以在创建 InnoDB/XtraDB 表时不要使用它。

    支持外键。

    【讨论】:

    • 嗨,感谢您的回答,不幸的是,这正是我的问题 - 我知道它不适用但我没有创建语句,它是在我的 Rails 应用程序和 mariadbclient 之间的某个位置生成的lib - 我不知道它来自哪里......
    • 唉,又一个第三方软件挡路的案例。
    【解决方案2】:

    我终于自己弄明白了。

    在 gem 源、rails 本身甚至 MariaDB 客户端库中没有发现任何 TRANSACTIONAL=1 的提示后,我尝试了 MariaDB。

    该语句不包含 TRANSACTIONAL 参数。

    这似乎是 MariaDB 10.0.21 中的一个错误。如果表是作为 MyISAM 或 ARIA 引擎创建的,或者在过去的某个时间转换为此引擎类型,则稍后转换为 INNODB 和任何后续的 ALTER TABLE 语句都会产生警告。

    这可以使用以下 SQL 重现:

    CREATE DATABASE testdb;
    CONNECT testdb;
    CREATE TABLE testtable (id INT(11)) ENGINE=INNODB;
    ALTER TABLE testtable ENGINE=INNODB;
    ALTER TABLE testtable ENGINE=INNODB;
    ALTER TABLE testtable ENGINE=ARIA TRANSACTIONAL=1;
    ALTER TABLE testtable ENGINE=INNODB;
    SHOW WARNINGS;
    ALTER TABLE testtable ENGINE=INNODB;
    SHOW WARNINGS;
    

    结果:

    MariaDB [(none)]> connect testdb;
    Connection id:    6698
    Current database: testdb
    
    MariaDB [testdb]> create table testtable (id INT(11)) ENGINE=INNODB;
    Query OK, 0 rows affected (0.30 sec)
    
    MariaDB [testdb]> alter table testtable ENGINE=INNODB;
    Query OK, 0 rows affected (0.35 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    MariaDB [testdb]> alter table testtable ENGINE=INNODB;
    Query OK, 0 rows affected (0.36 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    MariaDB [testdb]> alter table testtable ENGINE=ARIA TRANSACTIONAL=1;
    Query OK, 0 rows affected (0.49 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    MariaDB [testdb]> alter table testtable ENGINE=INNODB;
    Query OK, 0 rows affected, 1 warning (0.54 sec)
    Records: 0  Duplicates: 0  Warnings: 1
    
    MariaDB [testdb]> show warnings;
    +---------+------+------------------------------------------------------------------------------------+
    | Level   | Code | Message                                                                            |
    +---------+------+------------------------------------------------------------------------------------+
    | Warning | 1478 | Table storage engine 'InnoDB' does not support the create option 'TRANSACTIONAL=1' |
    +---------+------+------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    MariaDB [testdb]> alter table testtable ENGINE=INNODB;
    Query OK, 0 rows affected, 1 warning (0.39 sec)
    Records: 0  Duplicates: 0  Warnings: 1
    
    MariaDB [testdb]> show warnings;
    +---------+------+------------------------------------------------------------------------------------+
    | Level   | Code | Message                                                                            |
    +---------+------+------------------------------------------------------------------------------------+
    | Warning | 1478 | Table storage engine 'InnoDB' does not support the create option 'TRANSACTIONAL=1' |
    +---------+------+------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多