【问题标题】:Declare variable MySQL trigger and create table using that variable声明变量 MySQL 触发器并使用该变量创建表
【发布时间】:2019-12-05 06:32:22
【问题描述】:

我有一个事件,我将一个字符串存储在一个变量中。现在我想使用该变量来创建一个新表。每次我的活动运行时,它都会创建名为“mon”的表格。我做错了什么?

BEGIN
DECLARE onlyweek INT;
DECLARE mon VARCHAR(20);

SET @mon = "rehan";

CREATE TABLE mon(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    capacity INT NOT NULL
);

END

【问题讨论】:

    标签: mysql mysql-event


    【解决方案1】:

    因为您使用mon 而不是@mon。即使那样它也不会工作,因为你需要动态 SQL。

    但更重要的是:

    不要那样做!

    不要动态创建表。表格设计应该是静态的。这闻起来像是一个很大的设计缺陷。

    【讨论】:

    • 我这样做是为了每月存储数据。如果新月开始不在上个月表中插入数据,而是创建新表并将数据存储在其中
    • 您能说一下为什么动态创建表格不好?可能有需要temp 表的用例,对吗? @juergen d
    • @hammer:不,那是糟糕的设计。最好有一个同时存储日期的表格,然后您就不需要每个月的表格。
    • @Sela:当然有一些场景你需要这样做,但通常不需要。
    • @hammer:虽然我们很难反对“这是客户的要求”,但请确保 a) 它确实是他们要求的。它们可能只是用来表现出色,并希望您的应用程序在表格中显示每月的数据,而不关心底层表格的设计方式或措辞不当。他们可能没有听说过规范化,这就是你进来的地方。b)如果他们真的想要这个,试着说服他们,并确保他们理解后果(当然有适当的判断力)。 juergens 答案中的粗体文本是粗体是有原因的。
    【解决方案2】:

    这是一个设计错误。例如,您需要制作年度报告。在您的设计中,您必须加入 12 个表以及如何加入。这是非常缓慢的。 更好的设计是创建 2 个表 - “months”和“reporting_periods”,外键指向表“months”。这样,当您需要年度报告时 - 您只需按 ID 加入 2 个带有“where”的表格。

    表“月”可以使用相同的 mysql 事件每年填充一次。 然后使用 mysql "stored procedure" (和 mysql event) 定期插入到带有月份 ID 的reporting_period 中。月份的名称可以包含年份作为“不好的方式”或具有字段 'year' = 'better one'。

    CREATE TABLE months(
        id int auto_increment,
        name varchar(10),
        number int not null,
        year int not null,
        constraint monthes_pk
        primary key (id)
    );
    

    和reporting_period

       CREATE TABLE reporting_period(
       id INT auto_increment,
       period_id INT NOT NOT,
       capacity INT NOT NULL,
       constraint `reporting_period_pk`
          primary key (id),
       constraint `reporting_period__fk`
          foreign key (period_id) references months (id)
       );
    

    更多关于数据库设计:normalization

    【讨论】:

    • 您好!不,我不需要加入 12 个表来制作年度报告,因为我每月将数据移动到名为 YEAR 2019 的表中,所以当我想生成该年度的报告时,我只会从中查询桌子。我已经通过触发器和程序成功地实现了我想要的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多