Error: Column cannot be null (I have used primary key with auto_increment)
Error: Column cannot be null (I have used primary key with auto_increment)
我开始通过在线课程学习 MySQL,我的老师说最好先创建所有 table,然后更改 table 并插入primary/foreign 键。
我正在以这种方式进行练习,即使老师本人已经提供了答案,他在 table 中写了主键,并且只更改了外键。
我遇到的问题是插入数据时,错误显示 "column X cannot be null"。这是我的第一列,"idcliente",我用 auto_increment 将其更改为主键,现在我假设它在我插入数据时不会自动递增数字。我在网上查过关于identity的(还没学过,所以对我来说不太理想),values不能为null(我之前用这种方式插入过数据,当主键在table代码中时,并且有效)。我不确定我做错了什么。感谢任何答案。谢谢!
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): Column 'IDCLIENTE' cannot be null"
INSERT INTO CLIENTE VALUES (NULL,'JOAO','M');
不要提供 NULL:
INSERT INTO CLIENTE (NOME, SEXO) VALUES ('JOAO','M');
由于您的列 IDCLIENTE
设置为自动递增,因此您在插入时不需要提供它。 MySQL 会自动为您插入。
使用插入语句作为
INSERT INTO CLIENTE VALUES ('JOAO','M');
自动增量将在尝试在 table 中插入记录时自动创建一个唯一编号。
所以不要在查询中使用 NULL,试试这个:
插入客户端 (NOME,SEXO) 值 ('JOAO','M');
使用这个查询:SHOW COLUMNS FROM TABLE-NAME FROM DATABASE-NAME;
它将向您描述有关 table 结构的详细信息。
我测试了您的代码,然后查看了 table 定义:
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 列的正确语法。根据 https://dev.mysql.com/doc/refman/5.7/en/alter-table.html 中记录的语法,它可能是定义可选索引类型的语法。但是索引类型似乎被 InnoDB 忽略了。无论您在 PRIMARY KEY 和列列表之间键入什么,都将被忽略。
AUTO_INCREMENT 选项的语法与列一致,而不与约束一致。
mysql> ALTER TABLE CLIENTE
MODIFY COLUMN IDCLIENTE INT AUTO_INCREMENT,
ADD PRIMARY KEY (IDCLIENTE);
我开始通过在线课程学习 MySQL,我的老师说最好先创建所有 table,然后更改 table 并插入primary/foreign 键。 我正在以这种方式进行练习,即使老师本人已经提供了答案,他在 table 中写了主键,并且只更改了外键。 我遇到的问题是插入数据时,错误显示 "column X cannot be null"。这是我的第一列,"idcliente",我用 auto_increment 将其更改为主键,现在我假设它在我插入数据时不会自动递增数字。我在网上查过关于identity的(还没学过,所以对我来说不太理想),values不能为null(我之前用这种方式插入过数据,当主键在table代码中时,并且有效)。我不确定我做错了什么。感谢任何答案。谢谢!
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): Column 'IDCLIENTE' cannot be null"
INSERT INTO CLIENTE VALUES (NULL,'JOAO','M');
不要提供 NULL:
INSERT INTO CLIENTE (NOME, SEXO) VALUES ('JOAO','M');
由于您的列 IDCLIENTE
设置为自动递增,因此您在插入时不需要提供它。 MySQL 会自动为您插入。
使用插入语句作为
INSERT INTO CLIENTE VALUES ('JOAO','M');
自动增量将在尝试在 table 中插入记录时自动创建一个唯一编号。
所以不要在查询中使用 NULL,试试这个:
插入客户端 (NOME,SEXO) 值 ('JOAO','M');
使用这个查询:SHOW COLUMNS FROM TABLE-NAME FROM DATABASE-NAME; 它将向您描述有关 table 结构的详细信息。
我测试了您的代码,然后查看了 table 定义:
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 列的正确语法。根据 https://dev.mysql.com/doc/refman/5.7/en/alter-table.html 中记录的语法,它可能是定义可选索引类型的语法。但是索引类型似乎被 InnoDB 忽略了。无论您在 PRIMARY KEY 和列列表之间键入什么,都将被忽略。
AUTO_INCREMENT 选项的语法与列一致,而不与约束一致。
mysql> ALTER TABLE CLIENTE
MODIFY COLUMN IDCLIENTE INT AUTO_INCREMENT,
ADD PRIMARY KEY (IDCLIENTE);