【问题标题】:Syntax Error for Create Table in mySQL在 mySQL 中创建表的语法错误
【发布时间】:2018-02-28 11:25:41
【问题描述】:

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

需要一个右括号(接近))。

指的是右括号后跟分号。我认为它与 CONSTRAINTS 行有关,因为当我删除它们时它会消失。

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')
);

【问题讨论】:

标签: mysql sql database syntax


【解决方案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')
);

正如其他人所说:

  • 您应该使用反引号 (`) 而不是单引号 (')。
  • 将约束移动到定义中将使其更具可读性和更少的混乱。
  • 您应该将 UserId auto_increment 列作为主键,而不是使用 email 列。

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)
);

【讨论】:

  • 由于单引号,这仍然会导致问题。
  • 必须使用反引号`而不是单引号。
【解决方案2】:

这里有一些问题,我认为删除 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`)
);

请注意,我们还删除了 NOT NULLCONSTRAINT 子句,而是将它们添加到列定义中。

【讨论】:

    【解决方案3】:

    您需要在第一行 CONSTRAINT 的末尾添加一个逗号。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        删除单引号并将 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

        【讨论】:

          【解决方案6】:

          只需在除最后一个 CONSTRAINT 之外的每个 CONSTRAINT 之后放置一个 (comma) 。 这样: 约束 'User_FName_nn' NOT NULL('FName'),

          【讨论】:

            【解决方案7】:

            表名不需要单引号,并且你在第一行约束之后缺少其他人建议的逗号。

            这里... CREATE TABLE 用户(FName varchar(10) NOT NULL, LName varchar(10) NOT NULL, 电子邮件 varchar(20), 电话 int(20), 密码 varchar(20) NOT NULL,地址 varchar(100), 买家人数 int(3), SellerNum int(3), 约束 User_Email_pk 主键(电子邮件), CONSTRAINT User_Phone_uk UNIQUE(Phone) );

            【讨论】:

              【解决方案8】:

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

              其次,将这些简短的约束放在列定义中,除非您非常想命名它们:

              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)
              );
              

              为什么?

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

              【讨论】:

                猜你喜欢
                • 2014-04-09
                • 2016-02-07
                • 2014-05-17
                • 1970-01-01
                • 1970-01-01
                • 2012-08-14
                • 1970-01-01
                • 2013-01-06
                • 2018-06-14
                相关资源
                最近更新 更多