2015-04-07 33 views
-3

所以,为了简单起见,假设我有一个像这样的表(F1,F2,F3是字段):只有当某些字段值不相同时,我如何才能将其插入表中?

f1 f2 f3 
a b c 
d e f 

,说我有一个PHP数组这样我想添加到表:

a g h 

现在,我希望能够加入这一块,但我不希望能够加入这样的事情:

a e f 

场F1可以有重复。字段f2 & f3不能。我试过为f2添加一个唯一的索引,并使用REPLACE INTO,但这不是我想要的。如果在数据库表的同一行上没有找到f3 &字段条目,我需要在那里设置一个插入方式。


$query = "REPLACE INTO table1 (title, description, start, end, location, affiliation) 
      VALUES ('{$my_title_php_array[$count]}', 
        '{$my_description_php_array[$count]}', 
        '{$my_start_php_array[$count]}', 
        '{$my_end_php_array[$count]}', 
        '{$my_location_php_array[$count]}', 
        '{$my_affiliation_php_array[$count]}')”; 

description是数据类型 'TEXT',这是不能被用作INDEX(过大)的。理想情况下,我希望所有必须与传入的PHP数组条目进行比较检查。


比方说,我有我的新范例的PHP数组这些东西:

Title1 Desc1 1:00pm 2:00pm Loc1 Aff1 
Title1 Desc1 3:00pm 4:00pm Loc1 Aff1 
Title2 Desc2 1:00pm 2:00pm Loc2 Aff2 
Title2 Desc1 1:00pm 2:00pm Loc3 Aff3 

这些都应该被认为是独特的,进入了我希望只能够进入他们时,他们不完全匹配我的数据库中的一行。 Desc1很长。说明通常是最独特的。有缩短的方法吗?

+1

你可能会更好地发布你的*实际*数据和表结构。 a,b,c和f1,f2等是没有意义的。另外,你有没有任何PHP代码? – James

+0

f2和f3必须是单独的还是成对的?也就是说,在你的示例表中,我可以为f1 f2 f3插入一个e z吗? – Zippers

+2

要扩展@Zippers的答案:如果f2和f3都必须是唯一的,则需要在两列上创建一个组合索引,例如, '唯一索引(f2,f3)' – xathien

回答

-1

我最近查这个信息我,这里是我找到了答案: Use multiple columns as unique identifier for mysql

我相信这是你需要什么。

+0

这工作。通过使用'ALTER TABLE表ADD ADD UNIQUE KEY组合(标题,描述,开始,结束,位置,联盟);'与'REPLACE INTO'结合。谢谢。 –

-2

全球范围内,你想要一对入口的约束?在MySQL中,我认为你不能。只是,做一个选择(类似SELECT COUNT(*) FROM _table WHERE f1 = ? AND f2 = ?替换您的值)检查结果。

+0

当然,如果你想让你的数据最终成为一团糟。总是更好地处理这种类型的事情,在桌子上使用唯一的约束,键。 – developerwjk

+0

*“全球范围内,你想要一对入口的约束?在MySQL中,我认为你不能。”* - 错误。你可以:http://stackoverflow.com/questions/635937/how-do-i-specify-unique-constraint-for-multiple-columns-in-mysql –

-2

我个人会使用PHP和mysql检查数据库表中是否存在“f2”和“f3”行。

为了简单起见,我将使用标准的mysql,并假设表名是“alphabet”。例如:

$array = array('a', 'e', 'f'); 
$checkTable = mysql_query("SELECT * FROM `alphabet` WHERE `f2` = '".$array[1]."' OR `f3` = '".$array[2]."'"); 

if(!mysql_num_rows($checkTable)){ 
    mysql_query("INSERT INTO `alphabet` VALUES('".$array[0]."', '".$array[1]."', '".$array[2]."')"); 
} 

就像上面那样。让我们一起来看看它。

我们首先设置包含字母“a”,“e”和“f”的数组。

$ array [0] =“a”,$ array [1] =“e”,$ array [2] =“f”。

我们在数据库中检查字段“f2”或“f3”等于我们数组的第二个和第三个参数的任何行。

如果没有重复项,则使用mysql_num_rows()将继续并将数组添加到数据库表“alphabet”中。

纠正我,如果我错了,或者如果有人有一个更简单的解决方案。希望我帮助。

+0

这不适合我的目的。 –

+0

非常抱歉。 –

+0

我明白你在做什么,以及你的意思。这只是我认为我需要一种方法来检测传入的查询是否与我的数据库表中的行完全匹配。 –

-2
<?php 
    $data[] = 'f1 value'; 
    $data[] = 'f2 value'; 
    $data[] = 'f3 value'; 

    for ($i = 0; $i < count($data); $i++) { 
     for ($j = $i+1; $j < count($data); $j++) { 
      $value_a = $data[$i]; 
      $value_b = $data[$j]; 

      $query = "SELECT *FROM mytable WHERE "; 
      $query.= "(f1=".$value_a." AND f2=".$value_b.") OR"; 
      $query.= "(f1=".$value_a." AND f3=".$value_b.") OR"; 
      $query.= "(f2=".$value_a." AND f3=".$value_b.")"; 

      $result = mysql_query($query); 
      if (mysql_num_rows($result)) { 
       //duplicated 
      } 

     } 
    } 
?> 
+0

我明白你在做什么,但我想知道这是否是一个过程密集型方法。 –

+0

使用查询循环并不好,但这只是为了让你明白你所要做的。您只需要一个查询来检查值“a”和值“b”是表中任何列的一部分,但由于您有三个字段,所以您必须进行所有检查。但仍然可以改进,只需使用查询列表和另一个来验证这些值是否在具有相同ID的字段中。嵌入到另一个中的选择可能会解决。 –

相关问题