Php 如何更新MYSQL中的特定行
我有一个表,在那里我存储用户上传的文件。可以有5种不同的文件类型:个人资料图片、cpr文件、学位文件、视频文件、背景检查文件 表结构如下所示:Php 如何更新MYSQL中的特定行,php,mysql,Php,Mysql,我有一个表,在那里我存储用户上传的文件。可以有5种不同的文件类型:个人资料图片、cpr文件、学位文件、视频文件、背景检查文件 表结构如下所示: file_id, user_id, file_type, file_size, file_name, file_new_name, file_path, file_cat, date_created 我的问题是: 这种结构有效吗?还是我应该创建5个不同的表 如果我想更新,比如说用户配置文件图片行,那么最好的方法是什么?--我想出了一个可能不是最好的解决
file_id, user_id, file_type, file_size, file_name, file_new_name, file_path, file_cat, date_created
我的问题是:
file\u cat=“profile\u picture”和user\u id=:user\u id
所在的行。这会给系统带来很大的负荷吗插入到。。。价值观在表单中使用隐藏值进行重复密钥更新时
提前谢谢。这是三个问题,不是一个问题 这种结构有效吗?还是我应该创建5个不同的表 一张桌子就够了 如果我想更新,比如说用户配置文件图片行,那么 最好的办法是什么我想出了一个解决办法 这可能不是最好的-我更新了文件所在的行 =“profile\u picture”和user\u id=:user\u id。这会给系统带来很多负载吗 如果您在文件\u cat、用户\u id(两个字段上的复合索引)上有索引,则不会。如果你想让事情变得更精简,你可以存储常量而不是“profile_picture”等
profile_picture = 1
cpr = 2
....
background = 6
这将使表和索引稍微小一些。这可能会使查询稍微快一点
首先,当用户注册时,他没有任何文件。我应该使用用户吗
插入到。。。价值观使用隐藏值进行重复密钥更新时
以某种形式
没必要那样。没有新用户记录实际上让事情变得更容易。您可以执行COUNT(*)=0
查询,或者更好地执行EXISTS
查询,而无需获取行并检查它们
更新:
当您处理连接或子查询(例如,快速查找用户是否上传了个人资料picc)时,这些现有查询非常有用
SELECT * from users WHERE exists (SELECT * from pictures where pictures.user_id = users.id)
如果您正确使用主键,则您的
插入。。。在重复密钥更新时…
query将为您完成所有操作
对于您的表,您需要定义一个主键列。在这种情况下,我会说这是您的文件\u id
列。因此,如果您执行插入,MySQL服务器将检查您的file\u id
列是否已为该值定义,如果已定义,则将使用新值更新,否则将使用新的file\u id
添加一行新数据
我应该很容易将它分开,制作一个用于创建新行的脚本和另一个用于更新的脚本。通常,您会知道在应用程序中何时创建而不是何时更新。再次,正确使用主键将对您有很大帮助。在where
子句中使用主键是最有效的更新方法之一
不要将文件存储在数据库中,而是将其存储在磁盘上。参考文件在数据库中的位置。关于结构-这只是我的意见,但是个人资料图片会经常被访问,所以他们最好有自己的表。对它们的查询返回的速度应该比与其他查询一起存储时快得多。@KIKOSoftware是的。文件存储在磁盘上,路径在数据库中。问题的标题与实际问题不同。如果您存储的是配置文件图片文件,文件名中带有用户id,则不需要数据库行。谢谢您的解释,先生。您能给我一个关于If exists查询的快速示例吗?我使用了行计数。似乎需要更多的工作,但它确实有效。就性能而言,行计数和if exists之间是否有任何差异?是的,exists只需要检查一行。Count需要对所有匹配的rowsPerfect进行计数。谢谢你的解释。非常感谢