Estoy tratando de crear una nueva tabla en mySQL, y me muestra este error:

Se esperaba un corchete de cierre (cerca)).

Refiriéndose al corchete de cierre seguido del punto y coma. Creo que tiene algo que ver con la línea CONSTRAINTS, ya que desaparece cuando los elimino.

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')
);
1
Malak Sadek 28 feb. 2018 a las 14:25

7 respuestas

La mejor respuesta

Le falta una coma después de esta línea: 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')
);

Y como otras han dicho:

  • Debería usar ticks de retroceso (`) en lugar de comillas simples (').
  • Mover las restricciones a la definición lo hará más legible y menos confuso.
  • Debería tener una columna User_d auto_increment como clave principal en lugar de usar la columna de correo electrónico.

La answer de Gordon Linoff proporciona algunos buenos consejos que definitivamente debe considerar y comprender por qué desea usarlos a medida que avanza diseñando el resto de su base de datos.

Editar: Una solución alternativa sería la siguiente:

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
Topher 6 ago. 2018 a las 08:09

Tiene algunos problemas aquí, y no creo que el error desaparezca cuando elimine las cláusulas CONSTRAINT. Está utilizando comillas simples (') en lugar de comillas invertidas (`).

También le falta una coma después de su primera cláusula CONSTRAINT. Actualice de la siguiente manera:

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

Observe que también eliminamos las cláusulas CONSTRAINT para NOT NULL, y las agregamos a la definición de columna.

1
BenM 28 feb. 2018 a las 11:34

Primero, supongo que las comillas simples son todos errores tipográficos en la pregunta.

En segundo lugar, coloque estas restricciones breves en las definiciones de columna, a menos que tenga un fuerte deseo de nombrarlas:

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

Cuando divide la definición, se hace más difícil descubrir cómo se define realmente una columna determinada. "Oh, es una cadena que acepta valores NULL. ¡Espera! También es NOT NULL. ¡Espera! También es UNIQUE".

También cambié phone a una cadena. Algunos números comienzan con "0" so "+", por ejemplo.

Además, debe tener un userId como primera columna:

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

¿por qué?

  • Su estructura no permite que un usuario cambie su correo electrónico (porque como clave principal se hace referencia en otras tablas).
  • Las cadenas son menos eficientes en índices de clave externa.
0
Gordon Linoff 28 feb. 2018 a las 11:39

El nombre de la tabla no necesita comillas simples, y le falta una coma como lo sugieren todos los demás después de la primera línea de restricciones.

Aquí ... CREAR TABLA usuario (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 (Correo electrónico), CONSTRAINT User_Phone_uk UNIQUE (Teléfono));

0
niranjan harpale 28 feb. 2018 a las 11:36

Simplemente ponga una (coma), después de cada RESTRICCIÓN, excepto la última RESTRICCIÓN. tal que: CONSTRAINT 'User_FName_nn' NOT NULL ('FName'),

0
Tasnuva 28 feb. 2018 a las 11:35
You Forgot , after 
CONSTRAINT 'User_FName_nn' NOT NULL('FName') this
0
Mohini 28 feb. 2018 a las 11:31

Debe poner una coma después del final de su primera línea CONSTRAINT.

0
Adi219 28 feb. 2018 a las 11:28