From 1652521ceb9cd8eb1d841171d825f14850b52e57 Mon Sep 17 00:00:00 2001 From: Yoshiyuki Uehara Date: Fri, 9 Apr 2021 10:01:47 +0900 Subject: [PATCH] Turn off foreign key checking in MySQL. --- lib/SQL/Translator/Diff.pm | 6 ++++-- lib/SQL/Translator/Producer/MySQL.pm | 14 ++++++++++---- t/30sqlt-new-diff-mysql.t | 24 ++++++++++++++++++------ t/38-mysql-producer.t | 4 ---- t/64xml-to-mysql.t | 4 ---- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/lib/SQL/Translator/Diff.pm b/lib/SQL/Translator/Diff.pm index 4218fc3e9..b67fae733 100644 --- a/lib/SQL/Translator/Diff.pm +++ b/lib/SQL/Translator/Diff.pm @@ -295,8 +295,10 @@ sub produce_diff_sql { } if (@diffs) { - unshift @diffs, "BEGIN"; - push @diffs, "\nCOMMIT"; + my $begin_cmd = $producer_class->can('begin_commands') ? $producer_class->begin_commands() : "BEGIN"; + my $commit_cmd = $producer_class->can('commit_commands') ? $producer_class->commit_commands() : "\nCOMMIT"; + unshift @diffs, $begin_cmd; + push @diffs, $commit_cmd; } else { @diffs = ("-- No differences found"); } diff --git a/lib/SQL/Translator/Producer/MySQL.pm b/lib/SQL/Translator/Producer/MySQL.pm index 043042349..8e77419fe 100644 --- a/lib/SQL/Translator/Producer/MySQL.pm +++ b/lib/SQL/Translator/Producer/MySQL.pm @@ -281,7 +281,6 @@ sub produce { my $create = ''; $create .= header_comment unless ($no_comments); # \todo Don't set if MySQL 3.x is set on command line - my @create = "SET foreign_key_checks=0"; preprocess_schema($schema); @@ -330,9 +329,8 @@ sub produce { # print "@table_defs\n"; - push @table_defs, "SET foreign_key_checks=1"; - return wantarray ? ($create ? $create : (), @create, @table_defs) : ($create . join('', map { $_ ? "$_;\n\n" : () } (@create, @table_defs))); + return wantarray ? ($create ? $create : (), @table_defs) : ($create . join('', map { $_ ? "$_;\n\n" : () } @table_defs)); } sub create_trigger { @@ -963,7 +961,7 @@ sub drop_table { batch_alter_table( $table, { alter_drop_constraint => [ grep { $_->type eq 'FOREIGN KEY' } $table->get_constraints ] }, $options ), - 'DROP TABLE ' . _generator($options)->quote($table), + 'DROP TABLE ' . _generator($options)->quote($table) ); } @@ -993,6 +991,14 @@ sub next_unused_name { return $name; } +sub begin_commands { + return "BEGIN;\n\nSET foreign_key_checks=0;\n\n"; +} + +sub commit_commands { + return "\nSET foreign_key_checks=1;\n\nCOMMIT"; +} + 1; =pod diff --git a/t/30sqlt-new-diff-mysql.t b/t/30sqlt-new-diff-mysql.t index 79df23f22..deb929132 100644 --- a/t/30sqlt-new-diff-mysql.t +++ b/t/30sqlt-new-diff-mysql.t @@ -58,8 +58,6 @@ CREATE TABLE added ( id integer(11) NULL ); -SET foreign_key_checks=1; - ALTER TABLE old_name RENAME TO new_name; ALTER TABLE employee DROP FOREIGN KEY FK5302D47D93FE702E; @@ -99,6 +97,8 @@ ALTER TABLE deleted DROP FOREIGN KEY fk_fake; DROP TABLE deleted; +SET foreign_key_checks=1; + COMMIT; ## END OF DIFF @@ -120,8 +120,6 @@ CREATE TABLE added ( id integer(11) NULL ); -SET foreign_key_checks=1; - ALTER TABLE employee DROP COLUMN job_title; ALTER TABLE old_name RENAME TO new_name, @@ -143,6 +141,8 @@ ALTER TABLE deleted DROP FOREIGN KEY fk_fake; DROP TABLE deleted; +SET foreign_key_checks=1; + COMMIT; ## END OF DIFF @@ -190,8 +190,6 @@ CREATE TABLE added ( id integer(11) NULL ); -SET foreign_key_checks=1; - ALTER TABLE employee DROP FOREIGN KEY FK5302D47D93FE702E, DROP CONSTRAINT demo_constraint, DROP COLUMN job_title, @@ -214,6 +212,8 @@ ALTER TABLE person DROP CONSTRAINT UC_age_name, DROP TABLE deleted; +SET foreign_key_checks=1; + COMMIT; ## END OF DIFF @@ -257,6 +257,8 @@ COMMIT; BEGIN; +SET foreign_key_checks=0; + ALTER TABLE employee DROP FOREIGN KEY FK5302D47D93FE702E_diff; ALTER TABLE employee ADD COLUMN new integer NULL, @@ -264,6 +266,8 @@ ALTER TABLE employee ADD COLUMN new integer NULL, ADD CONSTRAINT new_constraint FOREIGN KEY (employee_id) REFERENCES patty (fake); +SET foreign_key_checks=1; + COMMIT; ## END OF DIFF @@ -308,6 +312,8 @@ COMMIT; BEGIN; +SET foreign_key_checks=0; + ALTER TABLE employee RENAME TO fnord, DROP FOREIGN KEY bar_fk, ADD CONSTRAINT foo_fk FOREIGN KEY (employee_id) REFERENCES foo (id); @@ -317,6 +323,8 @@ ALTER TABLE deleted DROP FOREIGN KEY fk_fake; DROP TABLE deleted; +SET foreign_key_checks=1; + COMMIT; ## END OF DIFF @@ -330,6 +338,8 @@ COMMIT; BEGIN; +SET foreign_key_checks=0; + ALTER TABLE `employee` RENAME TO `fnord`, DROP FOREIGN KEY `bar_fk`, ADD CONSTRAINT `foo_fk` FOREIGN KEY (`employee_id`) REFERENCES `foo` (`id`); @@ -339,6 +349,8 @@ ALTER TABLE `deleted` DROP FOREIGN KEY `fk_fake`; DROP TABLE `deleted`; +SET foreign_key_checks=1; + COMMIT; ## END OF DIFF diff --git a/t/38-mysql-producer.t b/t/38-mysql-producer.t index b3c3bf88c..7023ac96c 100644 --- a/t/38-mysql-producer.t +++ b/t/38-mysql-producer.t @@ -197,8 +197,6 @@ schema: EOSCHEMA my @stmts = ( -"SET foreign_key_checks=0", - "DROP TABLE IF EXISTS `thing`", "CREATE TABLE `thing` ( `id` unsigned int NOT NULL auto_increment, @@ -240,8 +238,6 @@ my @stmts = ( CONSTRAINT `fk_thing_3` FOREIGN KEY (`foo2`) REFERENCES `some`.`thing2` (`id`, `foo`) ) ENGINE=InnoDB", -"SET foreign_key_checks=1", - ); my @stmts_no_drop = grep {$_ !~ /^DROP TABLE/} @stmts; diff --git a/t/64xml-to-mysql.t b/t/64xml-to-mysql.t index 435fd616c..c4329e7df 100644 --- a/t/64xml-to-mysql.t +++ b/t/64xml-to-mysql.t @@ -31,8 +31,6 @@ $sqlt = SQL::Translator->new( die "Can't find test schema $xmlfile" unless -e $xmlfile; my @want = ( - q[SET foreign_key_checks=0], - q[DROP TABLE IF EXISTS `Basic`], q[CREATE TABLE `Basic` ( `id` integer(10) zerofill NOT NULL auto_increment, @@ -74,8 +72,6 @@ my @want = ( q[DROP TRIGGER IF EXISTS `bar_trigger_update`], q[CREATE TRIGGER `bar_trigger_update` before update ON `Basic` FOR EACH ROW BEGIN update modified2=timestamp(); END], - - q[SET foreign_key_checks=1], ); my $sql = $sqlt->translate(