首页 > 其他分享 >动态生成数据表

动态生成数据表

时间:2024-07-19 17:51:38浏览次数:14  
标签:return tableName param 生成 数据表 fieldName sql TABLE 动态

/**
 * 检查表是否存在
 * 
 * @param string $tableName 表名
 * @return bool 表是否存在
 */
private function tableExists($tableName): bool
{
    $result = Db::query("SHOW TABLES LIKE '{$tableName}'");
    return !empty($result);
}

/**
 * 创建表
 * 
 * @param string $tableName 表名
 * @param array $fields 字段信息数组
 * @param string $description 表描述
 * @return bool 是否成功创建表
 */
private function createTable($tableName, $fields, $description): bool
{
    try {
        // 构建默认的 SQL 语句,包含公共字段
        $sql = "CREATE TABLE `{$tableName}` (";
        $sql .= "`ID` INT AUTO_INCREMENT PRIMARY KEY COMMENT '序号',";
        $sql .= "`CREATED_BY` VARCHAR(64) NOT NULL COMMENT '创建人',";
        $sql .= "`CREATED_TIME` DATETIME NOT NULL COMMENT '创建时间',";
        $sql .= "`UPDATED_BY` VARCHAR(64) NOT NULL COMMENT '更新人',";
        $sql .= "`UPDATED_TIME` DATETIME NOT NULL COMMENT '更新时间',";

        // 拼接传递过来的字段
        foreach ($fields as $field) {
            $fieldName = $field['TABLE_FIELD_VALUE'];
            $fieldType = $field['TABLE_TYPE'];
            $fieldLength = isset($field['TABLE_LEN']) ? "({$field['TABLE_LEN']})" : '';
            $fieldComment = isset($field['TABLE_COMMENTS']) ? " COMMENT '{$field['TABLE_COMMENTS']}'" : '';
            $sql .= "`{$fieldName}` {$fieldType}{$fieldLength}{$fieldComment},";
        }

        // 移除最后一个逗号并结束语句
        $sql = rtrim($sql, ',') . ') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="' . $description . '";';

        // 执行 SQL 语句
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 更新表结构
 * 
 * @param string $tableName 表名
 * @param array $fields 字段信息数组
 * @return bool 是否成功更新表结构
 */
private function updateTable($tableName, $fields): bool
{
    try {
        // 获取现有表的字段信息
        $existingFields = Db::query("SHOW COLUMNS FROM `{$tableName}`");
        $existingFieldNames = array_column($existingFields, 'Field');

        // 记录要增加和删除的字段
        $addFields = [];
        $dropFields = array_flip($existingFieldNames);

        foreach ($fields as $field) {
            $fieldName = $field['TABLE_FIELD_VALUE'];
            $fieldType = $field['TABLE_TYPE'];
            $fieldLength = isset($field['TABLE_LEN']) ? "({$field['TABLE_LEN']})" : '';
            $fieldComment = isset($field['TABLE_COMMENTS']) ? " COMMENT '{$field['TABLE_COMMENTS']}'" : '';
            $fieldSql = "`{$fieldName}` {$fieldType}{$fieldLength}{$fieldComment}";

            if (in_array($fieldName, $existingFieldNames)) {
                if ($fieldName !== 'ID') {
                    unset($dropFields[$fieldName]);
                    // 修改字段
                    $addFields[] = "MODIFY {$fieldSql}";
                }
            } else {
                // 增加字段
                $addFields[] = "ADD {$fieldSql}";
            }
        }

        // 移除 'ID' 字段以防止删除它
        unset($dropFields['ID']);

        // 拼接 ALTER TABLE 语句
        $alterSql = "ALTER TABLE `{$tableName}` ";
        $alterSql .= implode(', ', $addFields);

        if (!empty($dropFields)) {
            foreach ($dropFields as $fieldName => $index) {
                $alterSql .= ", DROP `{$fieldName}`";
            }
        }

        // 执行 SQL 语句
        Db::execute($alterSql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 为字段添加索引
 * 
 * @param string $tableName 表名
 * @param string $fieldName 字段名
 * @param string|null $indexName 索引名(可选)
 * @return bool 是否成功添加索引
 */
private function addIndex($tableName, $fieldName, $indexName = null): bool
{
    try {
        $indexName = $indexName ?: $fieldName . '_idx';
        $sql = "CREATE INDEX `{$indexName}` ON `{$tableName}` (`{$fieldName}`)";
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 删除索引
 * 
 * @param string $tableName 表名
 * @param string $indexName 索引名
 * @return bool 是否成功删除索引
 */
private function dropIndex($tableName, $indexName): bool
{
    try {
        $sql = "DROP INDEX `{$indexName}` ON `{$tableName}`";
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 为字段添加主键
 * 
 * @param string $tableName 表名
 * @param string $fieldName 字段名
 * @return bool 是否成功添加主键
 */
private function addPrimaryKey($tableName, $fieldName): bool
{
    try {
        if ($fieldName !== 'ID') {
            $sql = "ALTER TABLE `{$tableName}` ADD PRIMARY KEY (`{$fieldName}`)";
            Db::execute($sql);
            return true;
        }
        return false;
    } catch (\Exception $e) {
        return false;
    }
}

/**
 * 删除主键
 * 
 * @param string $tableName 表名
 * @return bool 是否成功删除主键
 */
private function dropPrimaryKey($tableName): bool
{
    try {
        $sql = "ALTER TABLE `{$tableName}` DROP PRIMARY KEY";
        Db::execute($sql);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

说明

  • 在每个方法中加入了 try-catch 块,用于捕获异常。
  • 如果执行成功,返回 true;如果执行失败(抛出异常),返回 false

标签:return,tableName,param,生成,数据表,fieldName,sql,TABLE,动态
From: https://www.cnblogs.com/zxingduo/p/18312036

相关文章

  • 腾讯开源可控视频生成框架 MimicMotion
    腾讯开源可控视频生成框架MimicMotion来源:投稿作者: 菠萝的海子2024-07-1617:01:19 4腾讯宣布开源可控视频生成框架MimicMotion,该框架可以通过提供参考人像及由骨骼序列表示的动作,来产生平滑的高质量人体动作视频。公告称,大量的实验结果和用户调研表明Mim......
  • Java中的动态代理与AOP编程
    Java中的动态代理与AOP编程大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨Java中的动态代理和面向切面编程(AOP),这两者是构建灵活且可扩展系统的重要工具。1.动态代理概述在Java中,动态代理允许我们在运行时创建代理对象,从而可以在不修改现......
  • ActiViz实战:使用vtkStreamTracer生成流线
    文章目录1、vtkStreamTracer流线2、实例效果:3、代码实现1、vtkStreamTracer流线  vtkStreamTracer是VisualizationToolkit(VTK)中的一个类,用于在流场数据中生成流线。VTK是一个开源软件系统,用于三维计算机图形学、图像处理和可视化。它广泛应用于科学......
  • 生成式 AI 的发展方向,是 Chat 还是 Agent?
    目录:生成式AI的发展方向,是Chat还是Agent?对比个人观点总结生成式AI的发展方向,是Chat还是Agent?随着生成式AI技术的不断进步,关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统(Chat)中展现智慧,还是在自主代理(Agent)中体现能力?这一问题引发......
  • 速度与质量的碰撞——对抗扩散蒸馏 (ADD) 如何彻底改变图像生成
    引言DigiOps与人工智能是最新和最令人兴奋的进步之一,它是一种将速度和质量融为一体的图像生成技术。ADD的发展经历了几个关键阶段。最初,图像生成方法非常基础,而且经常产生不令人满意的结果。生成对抗网络(GAN)的引入标志着一项重大改进,可以使用双网络方法创建逼真的图像......
  • vue3 使用component is 动态组件
    使用方式父组件<template><divclass="box"><div><!--setup需要用变量的方式来写入is,如果是optionsapi方式可以用组件字符--><!--myProps属性可以直接传到动态组件--><component:is="childT"myProps="sldfjsklfjksf......
  • 【专题】2024年中国AIGC行业应用价值研究报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=36570原文出处:拓端数据部落公众号大模型的发展标志着AIGC时代的来临,没有大模型支撑的AI已成为旧时代产物,缺乏竞争力。技术的突破始终是AI发展的关键,而商业应用则是推动其迅速发展的加速器。AI的持久繁荣依赖于其商业化的成功。展望2024年,我们有......
  • R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据|附代码数据
    全文链接:http://tecdat.cn/?p=22956最近我们被客户要求撰写关于贝叶斯网络的研究报告,包括一些图形和统计输出。贝叶斯网络(BN)是一种基于有向无环图的概率模型,它描述了一组变量及其相互之间的条件依赖性。它是一个图形模型,我们可以很容易地检查变量的条件依赖性和它们在图中的方向......
  • Vue3动态生成组件
    在Vue3中,要遍历funConfig并动态生成组件,可以使用Vue的defineAsyncComponent来加载异步组件,并结合v-for指令在模板中进行渲染。以下是一个示例代码来实现这个需求:1.配置文件确保配置文件导出的是一个reactive对象:import{reactive}from'vue';exportconst......
  • NET9 Asp.net Core将整合OpenAPI的文档生成功能而无需三方库
    OpenAPI规范是用于描述HTTPAPI的标准。该标准允许开发人员定义API的形状,这些API可以插入到客户端生成器、服务器生成器、测试工具、文档等中。尽管该标准具有普遍性和普遍性,但ASP.NETCore在框架内默认不提供对OpenAPI的支持。当前ASP.NETCore不提供对OpenAPI......