Mysql 错误1048(23000)列不能为空,但我正在插入有效数据
有很多关于堆栈溢出的帖子,但是从我看到的20多篇文章来看,它们要么是在与MySQL接口时遇到的编码错误,我不想这样做,要么只是想要空值,但它们的表定义不正确 我在MySQL 5.6.19中看到一个错误,其中我有一个列不允许有空值。这很好,因为它不应该有空值。这是下表描述Mysql 错误1048(23000)列不能为空,但我正在插入有效数据,mysql,Mysql,有很多关于堆栈溢出的帖子,但是从我看到的20多篇文章来看,它们要么是在与MySQL接口时遇到的编码错误,我不想这样做,要么只是想要空值,但它们的表定义不正确 我在MySQL 5.6.19中看到一个错误,其中我有一个列不允许有空值。这很好,因为它不应该有空值。这是下表描述 mysql> describe z; +-------+----------+------+-----+---------+----------------+ | Field | Type
mysql> describe z;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| a | int(11) | NO | PRI | NULL | auto_increment |
| data | char(30) | NO | | NULL | |
| t | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
我的问题是我正在插入有效数据
mysql> insert into z (data, t) values('helloworld', sysdate());
ERROR 1048 (23000): Column 'data' cannot be null
还有一条信息可能会引起一些关注。。。也许不是
我有一个触发器和一个过程,在实现插入本列时执行。但是,我不认为这应该是一个问题,因为insert语句完成后触发器被激活
触发因素如下:
mysql> show triggers\G
*************************** 1. row ***************************
Trigger: insertuser
Event: INSERT
Table: z
Statement: begin
call triggerproc(sysdate(),user(),(select data from z where a = last_insert_id()));
end
Timing: AFTER
Created: NULL
sql_mode: NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
程序如下:
mysql> show create procedure triggerproc\G
*************************** 1. row ***************************
Procedure: triggerproc
sql_mode: NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `triggerproc`(in a datetime, in b char(30), in c char(30))
begin
insert into record (t,u,data) values(a,b,c);
end
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
为了更好地衡量,我还将包括记录表的定义
mysql> desc record;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| t | datetime | NO | | NULL | |
| u | char(30) | NO | | NULL | |
| data | char(30) | NO | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
我在MySQL参考手册中查找了任何有用的内容,但是除了标准错误之外,它似乎没有任何其他详细信息,并检查您的列是否未定义为NOTNULL。。。或者我错过了
无论如何,如果有人能帮我找出这个错误的原因,或者我怎样才能找到原因,我将不胜感激
提前谢谢
编辑:我的问题得到了很好的回答,他告诉我,要从刚通过触发器插入的列中获取新信息,可以使用new.column操作符。此外,他还提供了有助于理解位于的这个问题的文档
我只是想知道为什么我使用的触发器不能与insert语句一起工作,即使它应该在上一个语句之后激活,这使我相信它理论上应该工作。阅读上的文档,我会建议仅在最后一个触发器运行后才更新该值。我还创建了一个触发器,它将上一个INSERT\u ID的结果插入到另一个表中,并且它将始终插入INSERT语句之前插入的行的ID,如果之前没有插入,则插入0
在insert或update触发器中,始终可以通过使用NEW.column引用语句后的状态,其中column是表的列名 从z选择数据,其中a=last\u insert\u id-这是空的吗?第一个问题:为什么要使用从z选择数据,其中a=last\u insert\u id而不是NEW.data。目前表是空的,但在执行insert命令时,它应该自动用字符串“helloworld”填充字段,如错误消息所示。在使用先前插入的数据添加触发器之前,我对其进行了测试。选择字符串确实有效。感谢提供新的“列”信息,这正是我要查找的。到目前为止,我还没有看到这一点,不幸的是,由于这个事实,我觉得我的问题可能没有用。。。然而,也许它会帮助其他人。虽然我仍然想知道为什么这失败了,否则。。。