Remove all zero dates from MySQL database across all Tables

前端 未结 9 1497
-上瘾入骨i
-上瘾入骨i 2021-01-13 14:37

I have plenty of tables in MySQL which which contains zero date in dateTime column 0000-00-00 00:00:00

Using some sort of admin settings, Is it possibl

9条回答
  •  不思量自难忘°
    2021-01-13 14:43

    Prefix: You might want to check the concept of ETL in DataWareHousing, there are tools which should do the simple conversions for you, even Open Source ones like Kettle/Pentaho.

    But this one is easy when you use any programming language capable of composing SQL queries. I have made an example in perl, but php or java would do also the job:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use DBI;
    
    my $user='geheim';
    my $pass='secret';
    
    my $dbh = DBI->connect( "dbi:mysql:host=localhost:database=to_convert:port=3306", $user, $pass ) or die $DBI::errstr;
    
    # Prints out all the statements needed, might be checked before executed
    my @tables = @{ $dbh->selectall_arrayref("show tables") };
      foreach my $tableh ( @tables){
        my $tabname = $tableh->[0];
        my $sth=$dbh->prepare("explain $tabname");
        $sth->execute();
        while (my $colinfo = $sth->fetchrow_hashref){
          if ($colinfo->{'Type'} =~ /date/i && $colinfo->{'Null'} =~ /yes/i){
            print ("update \`$tabname\` set \`" . $colinfo->{'Field'} . "\` = '1990-01-01' where \`" . $colinfo->{'Field'} . "\` IS NULL; \n");
            print ("alter table \`$tabname\` change column \`" . $colinfo->{'Field'} . "\`  \`" . $colinfo->{'Field'} . "\` " . $colinfo->{'Type'} . " not null default '1990-01-01'; \n");
          }
        }
      }
    

    This does not change anything, but when the database has tables like:

    localmysql [localhost]> explain dt;
    +-------+------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+------+------+-----+---------+-------+
    | a     | date | YES  |     | NULL    |       |
    +-------+------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    localmysql [localhost]> explain tst
        -> ;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  |     | NULL    |       |
    | atime | datetime | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

    it produces the Statements:

    update `dt` set `a` = '1990-01-01' where `a` IS NULL; 
    alter table `dt` change column `a`  `a` date not null default '1990-01-01'; 
    update `tst` set `atime` = '1990-01-01' where `atime` IS NULL; 
    alter table `tst` change column `atime`  `atime` datetime not null default '1990-01-01'; 
    

    This list can then be reviewed and executed as Statements.

    Hope that Helps!

提交回复
热议问题