首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:列不能为空(我在auto_increment中使用了主键)

错误:列不能为空(我在auto_increment中使用了主键)
EN

Stack Overflow用户
提问于 2018-01-02 06:42:44
回答 4查看 2.9K关注 0票数 2

我开始通过在线课程学习MySQL,我的老师说,首先创建所有的表,然后修改表,插入主键/外键是很好的做法。我正在做这样的练习,尽管老师自己已经给出了答案,他把主键写在表格里,只修改外键。我遇到的问题是当插入数据时,一个错误显示“列X不能为空”。这是我的第一篇专栏"idcliente",我将其修改为auto_increment的主键,现在假设它不会在插入数据时自动增加数字。我在网上查看了身份(还没有学到,所以这对我来说并不理想),值不能为null (在此之前,当主键在表代码中并且工作时,我已经插入了数据)。我不知道我做错了什么。感谢你的回答。谢谢!

代码语言:javascript
复制
   CREATE TABLE CLIENTE (
    IDCLIENTE INT,
    NOME VARCHAR(30) NOT NULL,
    SEXO ENUM('M','F') NOT NULL
);

CREATE TABLE TELEFONE (
    IDTELEFONE INT,
    TIPO ENUM('RES','COM','CEL'),
    NUMERO VARCHAR(11),
    ID_CLIENTE INT
);

ALTER TABLE CLIENTE
ADD CONSTRAINT PK_CLIENTE
PRIMARY KEY AUTO_INCREMENT (IDCLIENTE);

ALTER TABLE TELEFONE
ADD CONSTRAINT PK_TELEFONE
PRIMARY KEY AUTO_INCREMENT (IDTELEFONE);

ALTER TABLE TELEFONE
ADD CONSTRAINT FK_CLIENTE_TELEFONE
FOREIGN KEY (ID_CLIENTE)
REFERENCES CLIENTE(IDCLIENTE);

INSERT INTO CLIENTE VALUES (NULL,'JOAO','M');

错误1048 (23000):列'IDCLIENTE‘不能为null“

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-02 07:06:42

我测试了您的代码,然后查看了表定义:

代码语言:javascript
复制
mysql> show create table CLIENTE\G
*************************** 1. row ***************************
       Table: CLIENTE
Create Table: CREATE TABLE `CLIENTE` (
  `IDCLIENTE` int(11) NOT NULL,
  `NOME` varchar(30) NOT NULL,
  `SEXO` enum('M','F') NOT NULL,
  PRIMARY KEY (`IDCLIENTE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

您没有将PK定义为AUTO_INCREMENT。

这就是问题所在:

代码语言:javascript
复制
ALTER TABLE CLIENTE
ADD CONSTRAINT PK_CLIENTE
PRIMARY KEY AUTO_INCREMENT (IDCLIENTE);

这不是定义AUTO_INCREMENT列的正确语法。根据https://dev.mysql.com/doc/refman/5.7/en/alter-table.html中记录的语法,可能是定义可选索引类型的语法。但是InnoDB似乎忽略了索引类型。在主键和列列表之间键入的任何内容都将被忽略。

AUTO_INCREMENT选项的语法与列一致,而不是约束。

代码语言:javascript
复制
mysql> ALTER TABLE CLIENTE 
  MODIFY COLUMN IDCLIENTE INT AUTO_INCREMENT, 
  ADD PRIMARY KEY (IDCLIENTE);
票数 2
EN

Stack Overflow用户

发布于 2018-01-02 06:45:28

代码语言:javascript
复制
INSERT INTO CLIENTE VALUES (NULL,'JOAO','M');

不要提供NULL:

代码语言:javascript
复制
INSERT INTO CLIENTE (NOME, SEXO) VALUES ('JOAO','M');
票数 1
EN

Stack Overflow用户

发布于 2018-01-02 06:49:57

由于您的列IDCLIENTE设置为自动增量,所以在执行插入时不需要提供它。MySQL会自动为您插入它。

使用insert语句作为

代码语言:javascript
复制
INSERT INTO CLIENTE VALUES ('JOAO','M');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48056622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档