Mysql 错误1048(23000)列不能为空,但我正在插入有效数据

Mysql 错误1048(23000)列不能为空,但我正在插入有效数据,mysql,Mysql,有很多关于堆栈溢出的帖子,但是从我看到的20多篇文章来看,它们要么是在与MySQL接口时遇到的编码错误,我不想这样做,要么只是想要空值,但它们的表定义不正确 我在MySQL 5.6.19中看到一个错误,其中我有一个列不允许有空值。这很好,因为它不应该有空值。这是下表描述 mysql> describe z; +-------+----------+------+-----+---------+----------------+ | Field | Type

有很多关于堆栈溢出的帖子,但是从我看到的20多篇文章来看,它们要么是在与MySQL接口时遇到的编码错误,我不想这样做,要么只是想要空值,但它们的表定义不正确

我在MySQL 5.6.19中看到一个错误,其中我有一个列不允许有空值。这很好,因为它不应该有空值。这是下表描述

    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”填充字段,如错误消息所示。在使用先前插入的数据添加触发器之前,我对其进行了测试。选择字符串确实有效。感谢提供新的“列”信息,这正是我要查找的。到目前为止,我还没有看到这一点,不幸的是,由于这个事实,我觉得我的问题可能没有用。。。然而,也许它会帮助其他人。虽然我仍然想知道为什么这失败了,否则。。。