パール木本のPerlテックブログ

世界的プロジェクトに携わるPerlプログラマー「パール木本」のテックブログ。書籍「業務に役立つPerl」,ユーチューバー, 木本システム代表取締役社長。

MariaDBの新しいバージョンは、デフォルト値の設定が必須の設定になっているようなので、引っ越しのタイミングで修正した

MariaDBの新しいバージョンは、デフォルト値の設定が必須の設定になっているようなので、引っ越しのタイミングで修正する。

mysqldumpで、出力したものに、フィールド定義が含まれているので、それを置換。

やりたかったことは以下。

  • すべてのフィールドにデフォルト値をいれたい。
  • 日付のデフォルト値を '0000-00-00' から '0001-01-01'にしたい
  • timestamp型をdatetime型にしたい

そんなことを考えて作ったPerlのスクリプトは以下です。

型ごとに、デフォルト値が異なるのと、デフォルト値が設定されていないという条件を探すのがポイント。

perl script.pl mydb.dump > mydb.dump.fix

ソースコードは以下。

# MariaDBのダンプファイルでNOT NULL制約が付いているフィールどにデフォルト値を追加する

use strict;
use warnings;

while (my $line = <>) {
  if ($line =~ /varchar/) {
    $line =~ s/NOT NULL(,|\n)/NOT NULL default ''$1/;
  }
  elsif ($line =~ /text/) {
    $line =~ s/NOT NULL(,|\n)/NOT NULL default ''$1/;
  }
  elsif ($line =~ /int/) {
    $line =~ s/NOT NULL(,|\n)/NOT NULL default 0$1/;
  }
  elsif ($line =~ /decimal/) {
    $line =~ s/NOT NULL(,|\n)/NOT NULL default 0$1/;
  }
  elsif ($line =~ / date /) {
    $line =~ s/NOT NULL(,|\n)/NOT NULL default '0001-01-01'$1/;
  }
  elsif ($line =~ /datetime/) {
    $line =~ s/NOT NULL(,|\n)/NOT NULL default '0001-01-01 00:00:00'$1/;
    $line =~ s/NOT NULL DEFAULT '0000-00-00 00:00:00'(,|\n)/NOT NULL DEFAULT '0001-01-01 00:00:00'$1/;
  }
  elsif ($line =~ /timestamp/) {
    $line =~ s/timestamp/datetime/;
    $line =~ s/NOT NULL(,|\n)/NOT NULL default '0001-01-01 00:00:00'$1/;
    $line =~ s/NOT NULL DEFAULT '0000-00-00 00:00:00'(,|\n)/NOT NULL DEFAULT '0001-01-01 00:00:00'$1/;
  }
  
  print $line;
}