[42000][1064] SQL 错误:无法在 DataGrip 中执行新表。

Posted

技术标签:

【中文标题】[42000][1064] SQL 错误:无法在 DataGrip 中执行新表。【英文标题】:[42000][1064] SQL Error: Can't execute new table in DataGrip. 【发布时间】:2018-12-17 21:32:41 【问题描述】:
create table Users
(
    AttendeeID varchar not null,
    FRAG boolean null,
    FirstName string null,
    LastName string null,
    BadgeName varchar null,
    BadgeNumber int not null,
    DateOfBirth date null,
    EmailAddress int not null,
    Password password null,
    PrivacyPolicy boolean null,
    TermsConditions boolean null
);

create unique index Users_AttendeeID_uindex
   on Users (AttendeeID);

create unique index Users_BadgeNumber_uindex
    on Users (BadgeNumber);

create unique index Users_EmailAddress_uindex
   on Users (EmailAddress);

alter table Users
    add constraint Users_pk
        primary key (AttendeeID);

所以,我正在学习数据库,并且我正在为我的 dbms 使用 Datagrip,但是当我尝试执行此操作时,我收到了以下错误:

[42000][1064] 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以了解在 'not null 附近使用的正确语法, FRAG 布尔空值, 名字字符串空, 姓氏字符串空, Ba' 在第 3 行。

原来的代码不是空的,所以我把它改成空了,不明白问题出在哪里。我在以前的问题中没有找到答案,任何帮助都会很棒。谢谢。

【问题讨论】:

您必须为 VARCHAR 指定长度:例如 VARCHAR(255)。此外,MySQL 没有 BOOLEAN 数据类型。您可以改用 TINYINT(1) UNSIGNED 并将 1 存储为 true,将 0 存储为 false。或者您可以使用 ENUM。 BOOLEAN 是 TINYINT 的别名,但它并不是真正的问题。建议将唯一索引上的一个作为表的主键,可能是AttendeeID 感谢您的帮助! 顺便说一下,DataGrip 应该在您运行查询之前突出显示您的语法错误:pp.userapi.com/Xw-zJsCkPNdkoOqG8Ex4Lx_bdoCat3yW22J6Sg/… 【参考方案1】:

varchar 需要指定长度,例如 varchar(30) 30 个字符。

string 不是类型,请使用 varchar(LENGTH)

password 不是类型,请使用 varbinary(LENGTH),因为我假设您做正确的事情并使用加盐哈希。

【讨论】:

谢谢!我正在编写程序,但他看不到我在做什么,因为我只是在给他发短信。但是谢谢你,因为现在我不必等 3 个小时让他回家修理它。【参考方案2】:

我知道已经晚了,但我会按我看到的来写:

CREATE TABLE Users
(
    AttendeeID CHAR(30) NOT NULL,
    FRAG ENUM('n', 'y') NOT NULL DEFAULT 'n',
    FirstName CHAR(50) NULL,
    LastName CHAR(50) NULL,
    BadgeName CHAR(100) NOT NULL,
    BadgeNumber CHAR(30) NOT NULL,
    DateOfBirth DATE NULL,
    EmailAddress CHAR(250) NOT NULL,
    Password CHAR(64) NOT NULL,
    PrivacyPolicy ENUM('n', 'y') NOT NULL DEFAULT 'n',
    TermsConditions ENUM('n', 'y') NOT NULL DEFAULT 'n',
    PRIMARY KEY (`AttendeeID`),
    UNIQUE KEY `Users_EmailAddress_uindex` (`EmailAddress`),
    UNIQUE KEY `Users_BadgeNumber_uindex` (`BadgeNumber`)
);

我使用CHAR 而不是VARCHAR 来提高性能,因为在这种情况下,对于数据库引擎来说,寻找数据在数学上很容易,因为行的大小是固定的。

为了便于阅读,我使用ENUM - 您以后还可以添加not sure 作为第三选择。 关于尺寸: TINYINT(1) 存储为 1 字节数据,ENUM('n','y') 也存储为 1 字节数据。

BadgeNumberCHAR,因为可能存在数字可能从 0 零开始的情况。喜欢:0000001023423 或者可能有业务任务来列举客人,例如:G00001 - 所以对我来说最好使用CHAR 作为徽章编号。

您还可能拥有UserBadges 表并将其与Users 表相关联 - 如果某个用户可能有很多徽章,例如他丢失了旧徽章或只是为了历史记录您将拥有A case 徽章的徽章为B case

根据想法User 和徽章是不同的实体。所以也得搞清楚。

我相信这些问题可能会迫使人们从一开始就让项目更加灵活。

【讨论】:

感谢您提供的信息。这些信息确实信息丰富且很有帮助。至于 BadgeNumber,据我所知,从我在这个项目中看到的徽章编号中,它们都以 1 或更高开头。我不知道这些信息,我喜欢它。 @SamanthaTigerlily 这就像预见到什么是可能的,当然你应该询问 PM 或技术主管。他们可能最了解。

以上是关于[42000][1064] SQL 错误:无法在 DataGrip 中执行新表。的主要内容,如果未能解决你的问题,请参考以下文章

CREATE FUNCTION 引发 SQL 错误 (1064) (42000)

错误 1064 (42000) : 使用 %s 附近的 SQL 语法有错误

SQLSTATE [42000]:语法错误或访问冲突:1064 在进行迁移时,您的 SQL 语法有错误

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

Laravel 6 - SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;