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布尔null, FirstName字符串为null, LastName字符串为null, Ba'在第3行。
最初,代码读取的内容不是null,因此我在不了解问题所在的情况下将其更改为null。在之前的问题中我没有找到答案,任何帮助都将非常有用。谢谢。
答案 0 :(得分:1)
varchar
必须具有30个字符的指定长度,例如varchar(30)
。
string
不是一种类型,请使用varchar(LENGTH)
。
password
不是一种类型,请使用varbinary(LENGTH)
,因为我假设您做对了事并使用了盐腌哈希。
答案 1 :(得分:0)
我知道已经很晚了,但是我会按照自己的意愿写出来:
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)
并存储为一个字节的数据,而ENUM('n','y')
也存储为1个字节的数据。
BadgeNumber
是CHAR
,因为可能存在数字可能从0
零开始的情况。像:0000001023423
,或者可能有一些繁琐的工作来吸引客人,例如:G00001
-因此对我来说,最好使用CHAR
作为徽章编号。
此外,您可能拥有UserBadges
表并将其与Users
表相关联-如果某些用户可能拥有许多徽章,例如他丢失了旧徽章或仅出于历史记录,那该怎么办? A case
的{{1}}徽章。
根据主意B case
和徽章是不同的实体。因此,也必须对其进行澄清。
我确定这样的问题可能会迫使人们从一开始就使项目变得更加灵活。