mySQL触发器?导致错误代码:1048列不能为空

时间:2014-08-20 20:18:56

标签: mysql sql triggers

我见过类似的问题,但从未见过对我有用的答案。我有下表和触发器定义......

DROP TRIGGER IF EXISTS c_consumption.newRateHistory;
DROP TABLE IF EXISTS c_consumption.myrate;
DROP TABLE IF EXISTS c_consumption.myratehistory;

USE c_consumption;
    CREATE TABLE `myrate` (
    `consumerId` varchar(255) DEFAULT NULL,
    `durationType` varchar(50) NOT NULL DEFAULT 'DAY',
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `itemId` varchar(50) NOT NULL,
    `quantity` double NOT NULL DEFAULT 1.0,
    `quantityType` varchar(100) NOT NULL DEFAULT 'GALLON',
    `timePeriod` double NOT NULL DEFAULT 1.0,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `UNIQUE_RATE` 
    (`itemId` ASC, `consumerId` ASC)
    ) ENGINE=InnoDB AUTO_INCREMENT=314 DEFAULT CHARSET=utf8;


  CREATE TABLE `myratehistory` (
    `consumerId` varchar(255) DEFAULT NULL,
    `durationType` varchar(50) DEFAULT NULL,
    `itemId` varchar(50) NOT NULL,
    `quantity` double DEFAULT NULL,
    `quantityType` varchar(100) DEFAULT NULL,
    `status` varchar(20) NOT NULL DEFAULT 'CREATED',
    `timePeriod` double DEFAULT NULL,
    `timestamp` DATETIME NULL,
    PRIMARY KEY (`itemId`, `consumerId`, `timestamp`)
  ) ENGINE=InnoDB AUTO_INCREMENT=314 DEFAULT CHARSET=utf8;

CREATE TRIGGER `newRateToHistory`
AFTER INSERT
ON myrate
FOR EACH ROW

  INSERT INTO myratehistory
  (
    consumerId,
    durationType,
    itemId,
    quantity,
    quantityType,
    status,
    timePeriod,
    timestamp
  )
    VALUES(
        new.consumerId,
        new.durationType,
        new.itemId,
        new.quantity,
        new.quantityType,
        'CREATED',
        new.timePeriod,
        now());

请注意,consumerId可以为null。

接下来我运行这个SQL语句:

INSERT INTO c_consumption.myrate (          
    consumerId,
    durationType,
    itemId,
    quantity,
    quantityType,
    timePeriod)
VALUES(
    null,
    'DAY',
    'MyItem',
    1.0,
    'GALLON',
    1.0);

我收到以下消息:

Error Code: 1048 Column 'consumerId' cannot be null

显然我做错了什么,但我不知道它是什么。任何帮助将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

只是一个猜测,为什么mysql允许无效列作为我不知道的主键的一部分

CREATE TABLE `myratehistory` (
    [...]
    PRIMARY KEY (`itemId`, `consumerId`, `timestamp`)

答案 1 :(得分:1)

ConsumerId是主键的一部分。主键的任何部分都不能为空。

答案 2 :(得分:0)

您的MySQL服务器以“严格”模式运行,如果没有严格模式,“优雅地”处理您的MySQL服务器会抛出错误。 从MySQL 5.7.5开始,默认的SQL模式包括STRICT_TRANS_TABLES,这正是你头疼的原因。

要更改服务器的模式,请修改my.cnf(如果您运行的是Windows,则为my.ini)并将模式设置为:

sql-mode=""

然后你必须像这样重启你的mysql服务器:

service mysql reload

或直接抛出init.d进程:

/etc/init.d/mysql reload

希望它会对你有所帮助。