如何更新MYSQL中的特定行

时间:2016-07-20 12:57:10

标签: php mysql

我有一张桌子,用于存储用户上传的文件。可以有5种不同的文件类型:个人资料图片,cpr文件,学位文件,视频文件,背景检查文件。

表结构是这样的:

file_id, user_id, file_type, file_size, file_name, file_new_name, file_path, file_cat, date_created

我的问题:

  1. 这种结构有效还是应该创建5个不同的表?
  2. 如果我想更新,让我们说用户个人资料图片行,那么最好的方法是什么呢? ---我想出了一个可能不是最好的解决方案 - 我更新file_cat = "profile_picture" and user_id=:user_id行。这会给系统带来很大的负担吗?
  3. 首先,当用户注册时,他没有任何文件。我应该在表单中使用隐藏值insert into ... VALUES ... on duplicate key update吗?
  4. 提前谢谢。

2 个答案:

答案 0 :(得分:5)

这是三个问题,而不是一个。

  

这种结构有效还是我应该创建5个不同的表?

一张桌子足够好

  

如果我想更新,请说出用户个人资料图片行   什么是最好的方法呢? ---我想出了一个解决方案   这可能不是最好的 - 我更新了file_cat的行   =" profile_picture"和user_id =:user_id。这会给系统带来很大的负担吗?

如果您在file_cat,user_id(两个字段上都是复合索引)上有索引,则不会。如果你想让事情变得更精简,你可以存储常数而不是' profile_picture'等等,例如

profile_picture = 1
cpr = 2
....
background = 6

这会使表和索引变小。 可能使查询稍快一些。

  

首先,当用户注册时,他没有任何文件。我应该用户   插入... VALUES ...在带有隐藏值的重复键更新时   在一种形式?

没必要。没有新用户的记录实际上使事情变得更容易。您可以执行COUNT(*) = 0查询或更好的EXISTS查询,而无需获取行并进行检查。

更新: 当您处理JOIN或子查询时,这些EXISTS查询非常有用,例如快速查找用户是否已上传个人资料picc

SELECT * from users WHERE exists (SELECT * from pictures where pictures.user_id = users.id)

答案 1 :(得分:1)

如果您正确使用主键,则insert ... on duplicate key update ...查询将为您完成所有操作。

对于您的表,您需要定义主键列。在这种情况下,我会说这是您的file_id列。因此,如果您执行插入操作,MySQL服务器将检查您的file_id列是否已为该值定义,如果是,它将使用新值更新,否则它将添加新的数据行新的file_id

我应该很容易分开它,创建一个用于创建新行的脚本和另一个用于更新的脚本。通常,您将知道何时创建而不是在应用程序中进行更新。再次正确使用主键将帮助您解决很多问题。在where子句中使用主键我非常确定是最有效的更新方法之一。

https://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html