MySQL将列设置为INSERT上同一表中其他列的CONCAT?

时间:2012-05-01 15:24:40

标签: php mysql

我有一个MySQL表,用于存储上传文件的详细信息,如下所示:

CREATE TABLE files (
    file_id bigint not null primary key auto_increment,
    file_name text,
    file_path text,
    file_extension varchar(15),
    file_link text);

当我插入记录时,磁盘上文件的实际名称设置为表生成的file_id - 所以虽然我可以记录各种细节,但数据库实际上并不知道是什么此时调用file。

确定在设置UPDATE列之后不久就运行另一个file_link语句很容易,但我想知道是否有办法在这里做一些更优雅的事情?

我想要做的是将file_link的值自动设置在INSERT上:CONCAT(file_path, file_id, file_extension),而不需要在之后立即运行另一个UPDATE语句。

有谁知道我怎么能做到这一点 - 如果这是一个坏主意你能解释为什么吗?

P.S我正在使用PHP来运行这些语句,如果这有所不同。

2 个答案:

答案 0 :(得分:2)

您可以使用以下触发器执行此操作:

DELIMITER $$

CREATE TRIGGER makelink BEFORE INSERT ON files
  FOR EACH ROW
    BEGIN
      SET NEW.file_link = CONCAT(NEW.file_path, NEW.file_id, NEW.file_extension);
    END;
$$

DELIMITER ;

...虽然我不得不说,我个人会使用SELECT语句来创建它,而不是让数据库在插入时执行这样的操作 - 确保存储静态数据的效率稍高,但是它使数据库模式不那么透明。

答案 1 :(得分:1)

通常,您不希望存储派生数据。当你有一些备用周期时,请对db规范化做一些阅读。