首页 > 解决方案 > 创建日期维度表时出现 MySQL 语法错误?

问题描述

我从网站复制了一些 MySQL 代码来创建日期维度表,并尝试在 PhpMyAdmin 中的 MySQL 实例上运行它,但出现错误。代码如下:

CREATE TABLE IF NOT EXISTS datedim  (
    date_id INT NOT NULL auto_increment,
    fulldate date,
    dayofmonth int,
    dayofyear int,
    dayofweek int,
    dayname varchar(10),
    monthnumber int,
    monthname varchar(10),
    year    int,
    quarter tinyint,
    PRIMARY KEY(date_id)
) ENGINE=InnoDB AUTO_INCREMENT=1000;


delimiter //

DROP PROCEDURE IF EXISTS datedimbuild;
CREATE PROCEDURE datedimbuild (p_start_date DATE, p_end_date DATE)
BEGIN
    DECLARE v_full_date DATE;

    DELETE FROM datedim;

    SET v_full_date = p_start_date;
    WHILE v_full_date < p_end_date DO

        INSERT INTO datedim (
            fulldate ,
            dayofmonth ,
            dayofyear ,
            dayofweek ,
            dayname ,
            monthnumber,
            monthname,
            year,
            quarter
        ) VALUES (
            v_full_date,
            DAYOFMONTH(v_full_date),
            DAYOFYEAR(v_full_date),
            DAYOFWEEK(v_full_date),
            DAYNAME(v_full_date),
            MONTH(v_full_date),
            MONTHNAME(v_full_date),
            YEAR(v_full_date),
            QUARTER(v_full_date)
        );

        SET v_full_date = DATE_ADD(v_full_date, INTERVAL 1 DAY);
    END WHILE;
END;

它是在 2009 年发布的,所以不知道问题是什么(也许是分隔符?)。

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“CREATE PROCEDURE datedimbuild (p_start_date DATE, p_end_date DATE) BEGIN D”附近使用正确的语法

https://tech.akom.net/archives/36-Creating-A-Basic-Date-Dimension-Table-in-MySQL.html

我尝试将 phpmyadmin sql 查询中的分隔符更改为//并删除 sql 代码中的分隔符行,但现在我得到:

2 errors were found during analysis.

Unexpected beginning of statement. (near "p_start_date" at position 415)
Unrecognized statement type. (near "DATE" at position 428) 

标签: mysqlphpmyadmin

解决方案


您已将分隔符更改为 // 所以您需要使用 // not ;

任何一个

delimiter //

DROP PROCEDURE IF EXISTS datedimbuild//
CREATE PROCEDURE datedimbuild (p_start_date DATE, p_end_date DATE)
BEGIN
  ...

或者

DROP PROCEDURE IF EXISTS datedimbuild;

delimiter //
CREATE PROCEDURE datedimbuild (p_start_date DATE, p_end_date DATE)
BEGIN
  ...

看看这个之前的问题delimiters-in-mysql


推荐阅读