Php MySQL在INSERT时是否将列设置为同一表中其他列的CONCAT?
我有一个MySQL表,用于存储上传文件的详细信息,如下所示: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——因此,尽管我可以记录各种详细信息,但
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: