#1064涉及datetime | timestamp

时间:2018-11-17 22:46:08

标签: sql datetime timestamp mysql-error-1064 create-table

我无法在mySQL中创建基本表来跟踪发送到同一数据库和文件夹中现有电子邮件列表的电子邮件,包括(1)序列号(2)发送时的时间戳(3)电子邮件主题(4 )电子邮件正文(5)源电子邮件。

这个问题与您网站上的先前问题有所不同(我已详细阅读了该问题),因为它太基本了-我实际上是在创建3种基本字段类型,并且有一个错误使我无法继续前进。我发现的所有其他对象都具有更复杂的考虑因素/因素,例如联接,迁移等,其中错误在于用户对那些复杂层的理解或部分理解或复制的继承代码,或者是真正的新手,其中某些人不了解基本知识。数据类型或基本语法,以及对任何入门的mySQL / SQL书籍的复习都会清除它。因此,没有一个适用于这种情况:一个干净,简单的初学者级别的情况,只有设置和下拉菜单可供选择(我不需要语法!),在这种情况下它将无法工作,并且会造成语法错误!

我正在将XAMPP用于OS X 5.6.19-0 [2016-03-04],mySQL版本是mariaDB,并且我正在使用OS X Mavericks进行macbook播放。我将根据“ HeadFirst PHP&MySQL”本书第3章建立该示例,在该示例中,我一如既往地尝试扩展该示例,以加深我的理解力,只会碰壁!

DB:“ elvis_store”,创建表:“ emails_sent”。我的phpmyadmin屏幕看起来像这样(逗号分隔和描绘成非数字数组,因为您的格式未遵守列)-所有未提及的列/设置都保留为默认空白:

名称:email#;类型:INT;索引:INDEX; A_I:[✔︎](选中复选框);虚拟性:持久。

名称:date-time_sent;类型:DATETIME;虚拟性:PERSISTENT;

名称:email_subject;类型:VARCHAR(75);虚拟性:PERSISTENT;

名称:email_body;类型:TEXT(65,535);虚拟性:PERSISTENT;

名称:send_from_email;类型:VARCHAR(75);虚拟性:PERSISTENT;

所有字段: 排序规则:utf8_unicode_ci(每列/全部) MIME类型:文字/纯色

存储引擎:InnoDB

phpmyadmin的SQL转换为:

CREATE TABLE `elvis_store`.`emails_sent` (
    `email` INT AS () PERSISTENT , 
    `date-time_sent` DATETIME AS () PERSISTENT ,
    `email_subject` VARCHAR(75) AS () PERSISTENT , 
    `email_body` TEXT AS () PERSISTENT , 
    `sent_from_email` VARCHAR(75) AS () PERSISTENT , 
    INDEX (`email`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

当我点击底部的“保存”或顶部的“执行”按钮时,出现#1064这个错误:

  

“#1064-您的SQL语法有误;请查看与您的MariaDB服务器版本相对应的手册,以在')PERSISTENT,date-time_sent DATETIME AS()PERSISTENT,{{ 1}} VA'位于第1行“

由于尝试了许多可能对我有意义的选项而导致的错误#1064中的变化,总是提到“ TIMESTAMP” /“ DATETIME”的名称,值等,因此可能是问题所在。操纵DATETIME值和时间戳对于Web应用程序的功能至关重要,因此,如何处理具有此类值的表和列(执行和不执行)是我的问题重点,尤其是因为我认为我拥有VARCHAR和INT索引在另一个表中工作,并在同一工作簿中执行。

我尝试以下操作均无济于事(仍然出现#1064错误):

  1. 从字段名称中消除“#”和“-”-我看不到我使用的归类阻止使用这些特殊字符;

  2. 将date-time_sent发送类型从DATETIME更改为TIMESTAMP和DATE;

  3. 更改datetime / timestamp字段的默认值默认为空,或者允许空值(通过复选框进行多种组合);

  4. 在我的XAMPP / SQL / PHP版本有问题的情况下,将文本字段的大小更改(大幅减少)到500个字符以下

我看不出有任何自由度可以改变,因为:

  1. 所有字段都必须保持不变-发送电子邮件后

  2. 电子邮件必须具有自动递增的序列号索引

  3. 自动时间戳记必须是默认值,是在电子邮件外出时创建的;

  4. 归类必须是可能会吸引大量国际客户的utf形式;

  5. 我不明白为什么phpmyadmin在创建与复选框和下拉列表等效的SQL时添加了“ AS()”,但是,如果是由系统创建该语言,那肯定不会出错;

  6. 时间戳记必须为DATETIME类型,因为范围“ 1000-01-01”至“ 9999-12-31”比TIMESTAMP类型的较窄范围(“ 1970-01-01 00:00:01” UTC至'2038-01-19 03:14:07'UTC)。从现在开始(2018-2038),我不想在20年内不支持所有时间戳的情况下计划重写我的网站,尤其是如果这些事情对于我的Web应用而言至关重要的话,即使我也不必这样做。

所以我被困住了。为什么#1064错误以及如何创建此基本表?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

虚拟列,也称为计算列或生成列,是表中的列,其值使用确定性表达式自动计算,特别是根据表中其他字段的值来计算。

支持它们的存储引擎是InnoDB,Aria,MyISAM和CONNECT

从您的基本表和问题来看,我了解您希望能够自己添加数据,当使用我的php admin表创建时,您不需要结构中所有列的输入,请避免默认,排序规则,属性,索引,生命力,MIME类型和浏览器转换;创建基本表时,可以在更改表时添加所需的表。

  

所有字段都必须保持不变-发送电子邮件后

我不明白这行的含义,但是一旦您从数据库中选择数据来发送电子邮件,数据库行就不应更改。那不是虚拟性[专栏是关于;在这里阅读更多

https://mariadb.com/kb/en/library/generated-columns/

将对您的表进行有效的查询

CREATE TABLE `elvis_store`.`emails_sent` (
    `email` INT, 
    `date-time_sent` DATETIME,
    `email_subject` VARCHAR(75), 
    `email_body` TEXT, 
    `sent_from_email` VARCHAR(75) , 
    INDEX (`email`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

答案 1 :(得分:0)

在此处发布几小时后,我认为也许datetime值(“ date-time_sent”)被我指定的“ persistent”绊倒了,因为它是剩下的仅有的几个删除说明符之一,并且可能被设计为默认为持久性某种-如果您不打算存储该信息,为什么要加上时间戳记?我意识到这可能是一种模式:不必要的说明符可能会使您无法创建mySQL表。

在使用相同的mariaDB XAMPP设置创建表时出现问题之前,需要使用一个额外的说明符-在这种情况下,自动递增的INT索引被指定为“无符号”(逻辑,对吗?因为它应该从零开始并朝正方向移动)引起的错误消息,直到将其删除。显然,mySQL(在本例中为mariaDB)知道索引应该从零开始,这样不仅不需要冗余说明符,而且还可以错误地阻止表的创建。同样,在这种情况下,默认情况下,mySQL知道要持久存储并保持值,而无需指定“ persistent”。

如上面的评论响应中所述,我删除了以datetime(“ date-time_sent”)列开头的所有“虚拟性”说明符,并认为这是唯一的,并且错误四处移动,直到删除了所有虚拟性说明符并创建了表。如上所述,在这种情况下,我误解了“虚拟性”中的默认值意味着未计算存储的持久值,因此它不是多余的/不必要的说明符,而是对说明符的误解(请参见上面的响应)。但是,我认为在与先前的问题结合使用时,有一个教训-在mySQL表创建中添加说明符可能是原本无法解释的错误的根源,并且应该删除说明符并测试mySQL默认值,即使默认值对于新开发人员而言也是如此像我这样是必要的,因为有时它们不是。