错误:列不能为空(我已将主键与auto_increment一起使用)

时间:2018-01-02 06:42:44

标签: mysql alter-table

我开始通过在线课程学习MySQL,我的老师说最好先创建所有表,然后更改表并插入主键/外键。 我正在做这样的练习,即使老师自己提供了答案,他在桌子内写了主键,只改变了外键。 我遇到的问题是插入数据时,错误显示“列X不能为空”。这是我的第一个专栏“idcliente”,我将其改为auto_increment的主键,现在我假设在插入数据时它不会自动递增数字。我已经在网上查看并看过身份(尚未学习,所以对我来说不太理想),值不能为空(我在这种方式之前插入数据,当主键在表代码中时,它工作正常)。我不确定我做错了什么。感谢任何答案。谢谢!

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

“ERROR 1048(23000):列'IDCLIENTE'不能为空”

4 个答案:

答案 0 :(得分:2)

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

不提供NULL:

INSERT INTO CLIENTE (NOME, SEXO) VALUES ('JOAO','M');

答案 1 :(得分:1)

我测试了你的代码,然后我看了一下表定义:

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。

这是问题所在:

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

这不是定义AUTO_INCREMENT列的正确语法。根据{{​​3}}中记录的语法,可能是定义可选索引类型的语法。但InnoDB似乎忽略了索引类型。无论您在PRIMARY KEY和列列表之间键入什么内容都将被忽略。

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

mysql> ALTER TABLE CLIENTE 
  MODIFY COLUMN IDCLIENTE INT AUTO_INCREMENT, 
  ADD PRIMARY KEY (IDCLIENTE);

答案 2 :(得分:0)

由于您的列IDCLIENTE设置为自动增量,因此在执行插入时无需提供它。 MySQL会自动为你插入它。

使用insert statement作为

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

答案 3 :(得分:0)

自动增量会在尝试在表格中插入记录时自动创建唯一编号。

所以不要在查询中使用NULL,试试这个:

插入客户(NOME,SEXO)价值观(' JOAO',' M');

使用此查询:从FROM-NAME FROM DATABASE-NAME显示列; 它将描述有关表结构的详细信息。