SQL语法中有错误;查看与MySQL服务器版本对应的手册,了解在"PRIMERY KEY"附近使用的正确语法

vsaztqbk  于 2023-02-07  发布在  Mysql
关注(0)|答案(2)|浏览(186)

我使用以下代码在MySQL上创建了一个表:

CREATE TABLE IF NOT EXISTS auth (
  id INT AUTO_INCREMENT,
  email VARCHAR(50) UNIQUE NOT NULL PRIMERY KEY,
  password VARCHAR(250) NOT NULL,
  username VARCHAR(50) UNIQUE,
  admin BOOLEAN NOT NULL DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

但我得到了这个错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PRIMERY KEY,
  password VARCHAR(250) NOT NULL,
  username VARCHAR(50) UNIQUE,

出了什么问题?
EDIT:这个问题是由于PRIMARY KEY中的一个错别字,但是在修复这个问题之后,我遇到了另一个错误:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
hs1ihplo

hs1ihplo1#

初级的错别字是初级的明显拼写错误。这是你本应该自己能回答的问题。
第二个问题是自动增量列必须是键的第一列,大多数人说它必须是主键,但从技术上讲它可以是表的任何键。
以下表定义有效:

CREATE TABLE IF NOT EXISTS auth (
  id INT UNIQUE AUTO_INCREMENT,
  email VARCHAR(50) PRIMARY KEY,
  password VARCHAR(250) NOT NULL,
  username VARCHAR(50) UNIQUE,
  admin BOOLEAN NOT NULL DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

UNIQUE添加到id列使其成为键,这满足了自动增量列是键的第一列的要求。
我删除了email列中的UNIQUE NOT NULL关键字,因为PRIMARY KEY暗示了这一点,这是多余的,不幸的是,如果您同时包含这两个关键字,MySQL将为email创建一个额外的不必要的唯一索引。

fcy6dtqo

fcy6dtqo2#

如果我没记错的话,您输入了主键,因此它应该是主键

CREATE TABLE IF NOT EXISTS auth (
  id INT AUTO_INCREMENT,
  email VARCHAR(50) UNIQUE NOT NULL PRIMARY KEY,
  password VARCHAR(250) NOT NULL,
  username VARCHAR(50) UNIQUE,
  admin BOOLEAN NOT NULL DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

编辑:您遇到的问题是因为您在不同的列上具有auto_increment主键。您可以在1列上同时使用这两个参数,但不能在2列上同时使用,因为每个表只能有1个自动增量。新脚本:

CREATE TABLE IF NOT EXISTS auth (
  id INT AUTO_INCREMENT PRIMARY KEY,
  email VARCHAR(50) UNIQUE NOT NULL,
  password VARCHAR(250) NOT NULL,
  username VARCHAR(50) UNIQUE,
  admin BOOLEAN NOT NULL DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

相关问题