我有这个脚本:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='STRICT_ALL_TABLES';
SET SQL_MODE = `STRICT_ALL_TABLES`;
CREATE TABLE IF NOT EXISTS `w_bank_account` (
`account_id` INT NOT NULL AUTO_INCREMENT,
`bank_id` INT(11) NOT NULL,
`account_number` VARCHAR(20) NOT NULL,
`account_type` ENUM('1','2') NOT NULL,
`balance` DECIMAL(19,4) NOT NULL DEFAULT 0,
`created` TIMESTAMP NOT NULL,
`modified` TIMESTAMP NULL,
PRIMARY KEY (`account_id`),
CONSTRAINT `fk_w_bank_account_n_bank1`
FOREIGN KEY (`bank_id`)
REFERENCES `n_bank` (`id`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
CREATE INDEX `fk_w_bank_account_n_bank1_idx` ON `w_bank_account` (`bank_id` ASC);
我尝试了这两个问题:
INSERT INTO `w_bank_account` (`bank_id`, `account_number`, `account_type`, `balance`) VALUES
(1, '01234567890123456789', '1', 0.0000),
(1, '01234567890123456789', '6', 0.0000);
它有效,但在第二个插入中,它将account_type
留空(我认为这会变为NULL): - 如果我将SQL_MODE
设置为 STRICT_ALL_TABLES ,为什么? ENUM
字段不应该获得第一个值而不是离开字段NULL
吗?我在Debian上使用MySQL 5.5.31
答案 0 :(得分:1)
http://dev.mysql.com/doc/refman/5.0/en/enum.html
如果您将无效值插入 ENUM(即不存在的字符串) 允许值列表), 替换为空字符串插入 特殊错误值。这个字符串可以 区别于“正常”空 字符串由这个字符串组成的事实 数值为0.更多关于 这个稍后。
您可以使用此触发功能
delimiter //
CREATE TRIGGER upd_check BEFORE UPDATE ON `w_bank_account`
FOR EACH ROW
BEGIN
IF (NEW.`account_type` != '2' AND NEW.`account_type` != '1')
SET NEW.`account_type` = '1';
END IF;
END;//
delimiter ;