これは通常、テーブル構造に設定された mysql エンジン タイプの不一致が原因で発生します。
driverClassName ="com.mysql.jdbc.Driver"
username = "username"
password = "password"
zeroDateTimeBehavior="convertToNull"
dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
mysql を使用している場合、最初に確認することは、方言を確認し、上記のように設定されていることを確認することです..
これは、すべてのテーブルが実際に InnoDB である必要があることを意味します。
これをワンライナーで実行するには、PASSWORD と DATABASE_NAME を詳細に変更します。
mysql -u root -pPASSWORD DATABASE_NAME -e "show table status where Engine='MyISAM';" | awk 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}' | mysql -u root -pPASSWORD DATABASE_NAME
または、mysql にログインしてこれを実行し、出力ポンプを使用して mysql に戻します。
SET @DATABASE_NAME = 'DATABASE_NAME';
SELECT CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema = @DATABASE_NAME
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC INTO OUTFILE '/tmp/myoutput.sql';
exit;
Linux cli から:
mysql DATABASE_NAME -u root -p < /tmp/myoutput.sql
デフォルトを私に定義することもできます InnoDB
mysql> SET SESSION storage_engine = InnoDB;
mysql> SET GLOBAL storage_engine = InnoDB;
しかし、それ以降はすべてが正しく保存されるため、実際には必要ありません。
ダイアレクトが定義されていない場合、MyISAM である mysql のデフォルト構成がデフォルトになり、上記のすべてを逆にして、InnoDB ではなく MyISAM にすることができます。
更新 ---- 2015 年 2 月
アップグレードを試みているときに、これと同じ古い問題に遭遇しましたが、今回は解決策が少し異なりました。
alter table servers_links add constraint FK_oder1rqc5maeen9dlb9sbpoav foreign key (servers_links_id) references servers (id)
2015-02-09 14:49:12,954 [localhost-startStop-1] ERROR hbm2ddl.SchemaUpdate - Cannot add or update a child row: a foreign key constraint fails (`myDB_prod`.<result 2 when explaining filename '#sql-736_d6'>, CONSTRAINT `FK_oder1rqc5maeen9dlb9sbpoav` FOREIGN KEY (`servers_links_id`) REFERENCES `servers` (`id`))
server_linksのエントリを追跡し ましょう
select * from servers_links limit 2;
+------------------+----------+
| servers_links_id | links_id |
+------------------+----------+
| 1 | 3 |
select a.servers_links_id, b.name FROM servers_links a LEFT JOIN servers b on a.servers_links_id=b.id where b.name is NULL;
+------------------+------+
| servers_links_id | name |
+------------------+------+
| 89 | NULL |
| 89 | NULL |
| 89 | NULL |
| 91 | NULL |
| 91 | NULL |
| 91 | NULL |
| 93 | NULL |
| 93 | NULL |
| 93 | NULL |
| 95 | NULL |
| 95 | NULL |
| 95 | NULL |
| 111 | NULL |
| 111 | NULL |
| 112 | NULL |
| 112 | NULL |
| 113 | NULL |
| 113 | NULL |
| 114 | NULL |
| 114 | NULL |
+------------------+------+
delete servers_links FROM servers_links LEFT JOIN servers ON servers_links.servers_links_id=servers.id where servers.name IS NULL;
Query OK, 20 rows affected (0.02 sec)
上記の内容は、サーバー テーブル内の存在しないエントリにマップされた、テーブル上の 20 レコードです。
上記の削除コマンドを使用すると、これらの不良エントリが削除されました。
複数のデータベース関係で上記の式を使用しましたが、同じように機能します。フィールドを競合するテーブルに一致するフィールドに置き換えるだけです