【问题标题】:MySQL: All parts of primary key must be NOT NULL; if you need NULL in a key, use UNIQUE insteadMySQL:主键的所有部分都必须是 NOT NULL;如果您需要在键中使用 NULL,请改用 UNIQUE
【发布时间】:2019-11-08 18:24:18
【问题描述】:

我的 MySQL 有问题。我创建了名为“BucketList”的数据库,然后我尝试创建名为“tbl_user”的表,它看起来像这样:

CREATE TABLE `BucketList`.`tbl_user` (
  `user_id` BIGINT NULL AUTO_INCREMENT,
  `user_name` VARCHAR(45) NULL,
  `user_username` VARCHAR(45) NULL,
  `user_password` VARCHAR(45) NULL,
  PRIMARY KEY (`user_id`));

之后我遇到了一个问题:“主键的所有部分都必须是 NOT NULL;如果您需要在键中使用 NULL,请改用 UNIQUE”

你们有什么想法吗,有什么问题吗? 我使用的 MySQL 版本是:

mysql --version
mysql Ver 14.14  Distrib 5.7.12, for Win64 (x86_64)

【问题讨论】:

  • 您的代码运行良好:sqlfiddle.com/#!9/f6a131.
  • 您发布的代码中的 PRIMARY KEY 是什么? user_id。您是如何定义 user_id 的? user_id BIGINT NULL AUTO_INCREMENT。错误信息说什么? 主键的所有部分都不能为空。您没有看到 BIGINT NULL AUTO_INCREMENTNOT NULL 有问题吗?错误消息包含有用的信息(它们不只是为了占用屏幕空间),但您必须实际阅读其中的文字。

标签: mysql sql database


【解决方案1】:

从 MySQL 5.7 开始,它不再支持主键的空值。

查看文档here

一个唯一索引,其中所有键列都必须定义为NOT NULL。如果它们没有显式声明为NOT NULL,MySQL 会隐含地(并且默默地)声明它们。一张表只能有一个PRIMARY KEY

因此,如果要用作主键,您的 user_id 键不能为空。您应该将其声明为不可为空:

CREATE TABLE `BucketList`.`tbl_user` (
  `user_id` BIGINT AUTO_INCREMENT,
  `user_name` VARCHAR(45) NULL,
  `user_username` VARCHAR(45) NULL,
  `user_password` VARCHAR(45) NULL,
PRIMARY KEY (`user_id`));

(注意BIGINT后面缺少NULL

【讨论】:

    【解决方案2】:

    同样,这也不适用于 Mysql 8.0+。表定义不接受 null 条件。

    not null 使用 主键 列定义时发生此错误。

    即使您定义了任何 复合键,这些列定义也不包含 not null 条件.

    搜索那些列,删除 not null 条件,这是删除错误的解决方案之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多