Как отделить CONSTRAINT от SHOW CREATE TABLE? - PullRequest
0 голосов
/ 21 мая 2019

Я хочу экспортировать базу данных в файл sql, теперь у меня есть два вопроса:
Как отделить CONSTRAINT от CREATE TABLE?
Теперь вывод выглядит так:

CREATE TABLE `comment` (
  `comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(8) unsigned NOT NULL,
  `content` varchar(300) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`comment_id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `Comment_User` FOREIGN KEY (`user_id`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

И я хочу сделать это так (похоже на phpmyadmin):

CREATE TABLE IF NOT EXISTS `comment` (
  `comment_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` int(8) UNSIGNED NOT NULL,
  `content` varchar(300) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`comment_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `comment`
  ADD CONSTRAINT `Comment_User` FOREIGN KEY (`user_id`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE;

Вот скрипт, который я делаю:

    //loop through the tables
    foreach ($tables as $table) {
        $result = $connectdb->query('SELECT * FROM '.$table);
        $numColumns = $result->field_count;
        $comment['separation_line'] = '-- -----------'."\n\n";
        $comment['table_structure'] = $comment['separation_line'].'--'."\n".'-- Table structure for table `'.$table.'`'."\n".'--'."\n\n";
        $comment['table_dumping_data'] = '--'."\n".'-- Dumping data for table `'.$table.'`'."\n".'--'."\n\n";
        $return .= $comment['table_structure'].'DROP TABLE IF EXISTS `'.$table.'`;';
        $result2 = $connectdb->query('SHOW CREATE TABLE '.$table);
        $row2 = $result2->fetch_row();
        if ($result->num_rows > 0) {
            $return .= "\n".$row2[1].";\n\n".$comment['table_dumping_data'];
            /* Get column name */
            $column_result = $connectdb->query('SELECT * FROM '.$table);
            $column_name = $column_result->fetch_all(MYSQLI_ASSOC);
            $get_column = array();
            if (!empty($column_name)) {
                $get_column = array_keys($column_name[0]);
            }
            $columns = '`'.implode('`, `', $get_column).'`';
            /* End get column name */
            $return .= 'INSERT INTO `'.$table.'` ('.$columns.') VALUES'."\n";
        } else {
            $return .= "\n".$row2[1].";\n\n";
        }
        for ($i = 0; $i < $numColumns; $i++) {
            while ($row = $result->fetch_row()) {
                $return .= '(';
                for ($j=0; $j < $numColumns; $j++) {
                    $row[$j] = addslashes($row[$j]);
                    $row[$j] = str_replace("\n", '\n', $row[$j]);
                    if (isset($row[$j])) {
                        if (ctype_digit($row[$j])) {
                            $return .= $row[$j];
                        } else {
                            $return .= '`'.$row[$j].'`';
                        }
                    } else {
                        $return .= '``';
                    }
                    if ($j < ($numColumns-1)) {
                        $return.= ',';
                    }
                }
                $return .= ');'."\n";
            }
        }
        $return .= "\n";
    }

Еще один маленький вопрос, как считать строки, а затемдобавить ), в конец каждой строки вместо );, если в таблице более двух строк?
Примерно так:

INSERT INTO `template` (`tpl_id`, `tpl_path`) VALUES
(1, 'template-common'),
(2, 'static-css'),
(3, 'static-css');

Теперь он добавит ); к каждой строке:

INSERT INTO `template` (`tpl_id`, `tpl_path`) VALUES
(1, 'template-common');
(2, 'static-css');
(3, 'static-css');
...