Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL在INSERT时是否将列设置为同一表中其他列的CONCAT?_Php_Mysql - Fatal编程技术网

Php MySQL在INSERT时是否将列设置为同一表中其他列的CONCAT?

Php MySQL在INSERT时是否将列设置为同一表中其他列的CONCAT?,php,mysql,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); 磁盘上文件的实际名称被设置为插入记录时由表生成的文件id——因此,尽管我可以记录各种详细信息,但

我有一个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);
磁盘上文件的实际名称被设置为插入记录时由表生成的文件id——因此,尽管我可以记录各种详细信息,但数据库实际上不知道此时调用了什么文件

当然,很容易在设置file_link列后不久运行另一个UPDATE语句,但是我想知道是否有一种方法可以在这里做一些更优雅的事情

我想做的是在插入时自动设置file_link的值:CONCATfile_路径、file_id、file_扩展名,而无需立即运行另一个UPDATE语句

有人知道我怎么做吗?如果这是个坏主意,你能解释一下原因吗


p.S我正在使用PHP来运行这些语句,如果这有什么不同的话。

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

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语句来创建它,而不是让数据库在insert上执行类似的操作-确保存储静态数据稍微更有效,但它会使数据库模式不那么透明。

通常,您不想存储派生数据。当您有一些空闲周期时,请阅读db规范化

@etherbunny主要是为了降低我将在多个地方使用的SELECT语句的复杂性-尽管最终如果我能在INSERT上设置file_链接,我很可能会删除file_路径和file_扩展名列。但是你是对的,它是冗余的,我倾向于做相反的事情:删除文件链接并保留文件路径。这样,如果您必须移动服务器上的文件,那么更新路径就很简单了。如果您将路径作为文件链接的一部分,那么更改它会有点复杂。@ethrbunny所以您希望每次都在“选择”或使用视图中计算文件位置,而忘记存储路径?我也想到了这一点,我从中看到了智慧。移动文件的可能性可能会变得非常灵活。如果您没有猜到,这也与我的最后一个问题有关-我现在有了名为目录的日期:通常您不想存储派生数据。@ethrbunny我想这只是我的直截了当的思维方式。如果您在回答中提到这一点,我可能会接受,在这一点上,似乎没有其他人有更好的想法,仅供将来参考,我在select中按照您和@ethrbunny的建议执行此操作,但触发器为+1: