mySQL中创建表的语法错误

时间:2018-02-28 11:25:42

标签: mysql sql database syntax

我正在尝试在mySQL中创建一个新表,它向我显示了这个错误:

  

预计会有一个结束括号(近))。

参考结束括号,然后是分号。我认为它与CONSTRAINTS系列有关,因为它在我删除它时会消失。

pg_temp

8 个答案:

答案 0 :(得分:1)

您在此行后面缺少逗号:CONSTRAINT' User_FName_nn' NOT NULL(' FName')

CREATE TABLE 'User' (
'FName' varchar(10),
'LName' varchar(10),
'Email' varchar(20), 
'Phone' int(20), 
'Password' varchar(20),
'Address' varchar(100),
'BuyerNum' int(3),
'SellerNum' int(3),
  CONSTRAINT 'User_FName_nn' NOT NULL('FName')    <--- ,
  CONSTRAINT 'User_LName_nn' NOT NULL('LName'),
  CONSTRAINT 'User_Email_pk' PRIMARY KEY('Email'),
  CONSTRAINT 'User_Phone_uk' UNIQUE('Phone'),
  CONSTRAINT 'User_Pass_nn' NOT NULL('Pass')
);

正如其他人所说:

  • 您应该使用后退标记(`)而不是单引号(&#39;)。
  • 将约束移动到定义中将使其更具可读性和更少混淆。
  • 您应该将UserId auto_increment列作为主键,而不是使用电子邮件列。

Gordon Linoff的answer提供了一些很好的提示,你应该仔细研究并理解为什么要在设计数据库的其余部分时使用它们。

编辑:另一种解决方案如下:

CREATE TABLE User2 (
UserId int auto_increment PRIMARY KEY,
FName varchar(10) NOT NULL,
LName varchar(10),
Email varchar(20) NOT NULL UNIQUE, 
Phone int(20), 
Password varchar(20)NOT NULL,
Address varchar(100),
BuyerNum int(3),
SellerNum int(3)
);

答案 1 :(得分:1)

这里有一些问题,我不认为删除CONSTRAINT子句时错误确实消失了。您使用单引号(')而不是反引号(`)。

在第一个CONSTRAINT子句后,您还缺少逗号。更新如下:

CREATE TABLE `User` (
`FName` varchar(10) NOT NULL,
`LName` varchar(10) NOT NULL,
`Email` varchar(20), 
`Phone` int(20), 
`Password` varchar(20) NOT NULL,
`Address` varchar(100),
`BuyerNum` int(3),
`SellerNum` int(3),
  CONSTRAINT `User_Email_pk` PRIMARY KEY(`Email`),
  CONSTRAINT `User_Phone_uk` UNIQUE(`Phone`)
);

请注意,我们还删除了CONSTRAINT的{​​{1}}子句,而是将它们添加到列定义中。

答案 2 :(得分:0)

您需要在第一行CONSTRAINT行结束后加上逗号。

答案 3 :(得分:0)

You Forgot , after 
CONSTRAINT 'User_FName_nn' NOT NULL('FName') this

答案 4 :(得分:0)

删除单引号并将NOT NULL添加到所需字段。

并且,如果可能的话,不要使用保留字。

CREATE TABLE User_Account 
(
FName varchar(10) NOT NULL,
LName varchar(10) NOT NULL,
Email varchar(20), 
Phone int(20), 
Password varchar(20) NOT NULL,
Address varchar(100),
BuyerNum int(3),
SellerNum int(3),
  CONSTRAINT User_Email_pk PRIMARY KEY(Email),
  CONSTRAINT User_Phone_uk UNIQUE(Phone)
);

dbfiddle here

答案 5 :(得分:0)

首先,我假设单引号都是问题中的拼写错误。

其次,将这些短约束放在列定义中,除非你有强烈的命名要求:

CREATE TABLE User (
    FName varchar(10) NOT NULL,
    LName varchar(10) NOT NULL,
    Email varchar(20) PRIMARY KEY, 
    Phone varchar(20) UNIQUE, 
    Password varchar(20) NOT NULL,  -- should be encrypted
    Address varchar(100),
    BuyerNum int(3),
    SellerNum int(3)
);

分割定义时,很难弄清楚给定列的定义方式。 “哦,这是一个接受NULL值的字符串。等等!它也是NOT NULL。等等!它也是UNIQUE。”

我还将phone更改为字符串。例如,有些数字以“0”或“+”开头。

此外,您应该有userId作为第一列:

CREATE TABLE User (
    UserId int auto_increment PRIMARY KEY,
    FName varchar(10) NOT NULL,
    LName varchar(10) NOT NULL,
    Email varchar(20) NOT NULL UNIQUE, 
    Phone varchar(20) UNIQUE, 
    Password varchar(20) NOT NULL,  -- should be encrypted
    Address varchar(100),
    BuyerNum int(3),
    SellerNum int(3)
);

为什么?

  • 您的结构不允许用户更改其电子邮件(因为作为主键在其他表中引用)。
  • 字符串在外键索引中的效率较低。

答案 6 :(得分:0)

在每个CONSTRAINT之后放一个(逗号),除了最后一个CONSTRAINT。 这样: CONSTRAINT&#39; User_FName_nn&#39; NOT NULL(&#39; FName&#39;),

答案 7 :(得分:0)

表名不需要单引号,并且在第一行约束之后,其他所有人都建议使用逗号。

下面... CREATE TABLE用户(FName varchar(10)NOT NULL,  LName varchar(10)NOT NULL, 电子邮件varchar(20),  电话int(20), 密码varchar(20)NOT NULL,地址varchar(100), BuyerNum int(3), SellerNum int(3), CONSTRAINT User_Email_pk PRIMARY KEY(电子邮件), CONSTRAINT User_Phone_uk UNIQUE(电话));