我见过类似的问题,但从未见过对我有用的答案。我有下表和触发器定义......
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
显然我做错了什么,但我不知道它是什么。任何帮助将不胜感激。
谢谢!
答案 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
希望它会对你有所帮助。