数据库规范化和懒惰开发

时间:2010-11-22 14:37:23

标签: php mysql

我相信这个问题已经出现了,因为我做了两倍于我想象的工作的烦恼是必要的。

我接受这样的想法,即我可能缺乏使用MySQL和PHP的经验来考虑更简单的解决方案。

我的问题是我有几个表(我可能会添加更多),这些是父表,只包含两个字段 - 一个id(int)和一个标识它的名称。

此刻,我有七张桌子,每张桌子至少有15个。每个表都有一个字段,包含我可以链接到父表的id。

不需要填写所有这些数据 - 您只需在父表中创建一个条目即可。对于其他表格,我有单独的表格。

现在,这些表单用于更新字段中的数据,这意味着如果有任何数据可用,我必须从表中提取数据。

我想要做的是当我从表单中收到数据时,我可以在模型中使用UPDATE查询。但是如果我要更新的表没有该特定id的条目,我需要插入。

所以,我目前的伪代码是这样的:

$sql = "SELECT id FROM table_x WHERE parent_id = ".$parent_id;
$res = $mysql_query($sql);
if( mysql_num_rows($res) == 1 )
{
  $sql = "UPDATE table_x SET ... WHERE parent_id = ".$parent_id;
}
else
{
  $sql = "INSERT INTO table_x VALUES ( ... )";
}
mysql_query($sql);

对于我拥有的每张桌子,我有两个这样做 - 我可以做一些不同或更聪明的事情,或者这只是必须要做的事情吗?因为这对我来说似乎效率很低。

4 个答案:

答案 0 :(得分:4)

使用

INSERT ... ON DUPLICATE KEY UPDATE Syntax

如果找不到记录,它将插入,
否则,它将更新现有记录,
并且您可以在插入前跳过检查 - details

这个假设每个7表与父表的关系是1:1

答案 1 :(得分:2)

或者使用REPLACE而不是INSERT - 它是一个插入,但会在违反唯一键(例如主键)时执行DELETE然后INSERT。

答案 2 :(得分:0)

mysql_query("UPDATE table table_x ..... WHERE parent_id=".$parent_id);
if (mysql_affected_rows()==0) {
    mysql_query("INSERT INTO .....");
}

答案 3 :(得分:0)

在mysql中你可以这样做:

INSERT INTO table
  (
    col1,
    col2
  ) VALUES(
    'val1',
    'val2'
  ) ON DUPLICATE KEY UPDATE table SET 
    col2 = 'val2'

查看documentation了解更多信息