我希望在每个会话的基础上指定一个列的默认值。以下脚本不起作用,但描述了我想如何使用它。我目前正在使用MySQL 5.5.28,但如有必要可以升级。
CREATE TABLE my_tbl (
id INT NOT NULL AUTO_INCREMENT,
data VARCHAR(45),
date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
date_modified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by INT DEFAULT CUSTOM_USER_ID,
modified_by INT ON UPDATE CUSTOM_USER_ID
PRIMARY KEY (id)
) ENGINE = InnoDB;
-- Will set created_id and modified_id=111
SET @CUSTOM_USER_ID=111;
INSERT INTO my_tbl(data) VALUES('hello');
-- Will set modified_id=222
SET @CUSTOM_USER_ID=222;
UPDATE my_tbl SET data='goodby' WHERE id=1;
-- Will keep modified_id=222
SET @CUSTOM_USER_ID=333;
UPDATE my_tbl SET data='hello again',modified_id=modified_id WHERE id=1;
答案 0 :(得分:3)
所以我发布了另一种选择:
delimiter $$
SET @CUSTOM_USER_ID=111;
CREATE TRIGGER myTrigger_INS BEFORE INSERT ON my_tbl FOR EACH ROW
BEGIN
IF NEW.created_by IS NULL OR NEW.created_by = '' THEN
SET NEW.created_by = @CUSTOM_USER_ID;
END IF;
END$$
CREATE TRIGGER myTrigger_UPD BEFORE UPDATE ON my_tbl FOR EACH ROW
BEGIN
IF NEW.modified_by IS NULL OR NEW.modified_by = '' THEN
SET NEW.modified_by = @CUSTOM_USER_ID;
END IF;
END$$
delimiter ;
答案 1 :(得分:1)
这是不可能的。从MySQL文档中阅读以下内容:
数据类型规范中的DEFAULT值子句指示列的默认值。除了一个例外,默认值必须是常量;它不能是一个功能或表达。这意味着,例如,您不能将日期列的默认值设置为函数的值,例如NOW()或CURRENT_DATE。例外情况是您可以将CURRENT_TIMESTAMP指定为TIMESTAMP列的默认值。请参见第11.3.5节“TIMESTAMP的自动初始化和更新”。
您不能使用这样的表达式来定义默认值。