1

我希望在每个会话的基础上指定列的默认值。下面的脚本不起作用,但描述了我想如何使用它。我目前使用的是 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;
4

2 回答 2

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 ;

学分

于 2013-04-16T00:41:56.720 回答
1

这是不可能的。从 MySQL 文档中阅读以下内容:

数据类型规范中的 DEFAULT value 子句指示列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。例如,这意味着您不能将日期列的默认值设置为 NOW() 或 CURRENT_DATE 等函数的值。例外情况是您可以将 CURRENT_TIMESTAMP 指定为 TIMESTAMP 列的默认值。请参见第 11.3.5 节,“TIMESTAMP 的自动初始化和更新”。

您不能使用这样的表达式来定义默认值。

于 2013-04-16T00:33:48.797 回答