错误1048(23000)列不能为NULL,但是我插入有效数据

时间:2014-08-06 06:59:37

标签: mysql

Stack Overflow上有很多这些帖子,但是从20左右开始,我看到他们要么是在与MySQL连接时遇到的编码错误(我不想做)或只是想要null值但是他们有表定义不正确。

我在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参考手册中的任何可能有用的内容,但是除了标准错误之外,似乎没有任何其他详细信息,并检查您的列未定义为非null。或者我错过了......

无论如何,如果有人能帮助我找出错误的原因或者我如何找到原因,我将非常感激。

提前致谢。

编辑:TheConstructor我的问题得到了很好的回答,他告诉我要从刚刚通过触发器插入的列中获取新信息,可以使用NEW.column运算符。此外,他随后提供了有助于理解位于Trigger Syntax

的问题的文档

我只想知道为什么我的触发器不会与insert语句一起使用,即使它应该在前一个语句之后激活,这使我相信它应该(理论上)工作。 < / p>

1 个答案:

答案 0 :(得分:6)

阅读LAST_INSERT_ID()上的文档我建议只在最后一次触发器运行后更新该值。我还创建了一个触发器,它将LAST_INSERT_ID()的结果插入到另一个表中,如果之前没有INSERT,它将始终插入由0语句插入的行的id。 {1}}。

在插入或更新触发器中,您始终可以使用INSERT引用语句后的状态,其中NEW.column是表的列名。 See the documentation for examples