Php 对多个非';t主键

Php 对多个非';t主键,php,mysql,sql,Php,Mysql,Sql,我基本上需要做一个“insert if not exists else update”类型的查询,我读过的所有内容都告诉我应该这样做。问题是,我的主键是一个自动增量值,我从来没有与之交互或跟踪过它,并且我不能真正动态地生成它以放入我的查询中 典型的行是: ID |项目| ID |位置|成本|中心|类别|名称|编号|年份| Q | 1 | 1 | 200 | NUH | 1 | asfoi | 1098123 |等 基本上,每一行的唯一性(不是字面意义上的)来自于项目ID、位置、成本中心、类别、名

我基本上需要做一个“insert if not exists else update”类型的查询,我读过的所有内容都告诉我应该这样做。问题是,我的主键是一个自动增量值,我从来没有与之交互或跟踪过它,并且我不能真正动态地生成它以放入我的查询中

典型的行是:

ID |项目| ID |位置|成本|中心|类别|名称|编号|年份| Q | 1 |

1 | 200 | NUH | 1 | asfoi | 1098123 |等

基本上,每一行的唯一性(不是字面意义上的)来自于项目ID、位置、成本中心、类别、名称、编号和年份的组合。如果这些都是相同的,那么将更新到
Q_1

UPDATE Labour_Planning 
        SET $Q = $submit
        WHERE Project_ID = $selected_project 
        AND Year = $selected_year 
        AND Cost_Center_Category = $CCC 
        AND Cost_Center_Name = '$CC' 
        AND Cost_Center_Number = '$CC_Number'
        AND Location = '$location';
是的,我知道,SQL注入和所有这些,我会让这一切变得更好。现在,我需要找出一种方法,如果上面的任何列不同,基本上插入一行。在重复键上插入…是否可能


我看到的每个示例都在insert语句中使用主键,在本例中,这是不可能的。

我已经做了一些测试,这就是我得到的结果

create table test.a (
  a int PRIMARY KEY,
  b int,
  c int
);

create UNIQUE index some_index on test.a(b,c);

insert into test.a VALUES (1,2,3); 
insert into test.a VALUES (2,2,3); -- fails
insert into test.a VALUES (2,2,3) ON DUPLICATE KEY UPDATE a = 2; -- updates

因此,您需要在您认为必须唯一的字段上创建复合唯一索引。

< P>我已经做了一些测试,这就是我得到的

create table test.a (
  a int PRIMARY KEY,
  b int,
  c int
);

create UNIQUE index some_index on test.a(b,c);

insert into test.a VALUES (1,2,3); 
insert into test.a VALUES (2,2,3); -- fails
insert into test.a VALUES (2,2,3) ON DUPLICATE KEY UPDATE a = 2; -- updates

因此,您需要在您认为必须是唯一的字段上创建复合唯一索引。

< P>我不想这样做,因为担心讨厌的开销,但是考虑到我实际上不会有很多更新/插入,我就这样做了。p>
    $labour_select = "SELECT Project_ID 
                    FROM Labour_Planning 
                    WHERE Project_ID = $selected_project
                    AND Year = $selected_year 
                    AND Cost_Center_Category = $CCC 
                    AND Cost_Center_Name = '$CC' 
                    AND Cost_Center_Number = '$CC_Number'
                    AND Location = '$location';";
    $result = $mysqli->query($labour_select);
    $num_rows = mysqli_num_rows($result);
    if ($num_rows == 0){
        $labour_insert = "INSERT INTO Labour_Planning (Project_ID, Location, Cost_Center_Category, Cost_Center_Name, Cost_Center_Number, Year, $Q) VALUES ($selected_project, '$location', $CCC, '$CC', '$CC_Number', $selected_year, $submit)";
        $insert_result = $mysqli->query($labour_insert);
    }
    else {
        $labour_update = "UPDATE Labour_Planning 
        SET $Q = $submit
        WHERE Project_ID = $selected_project 
        AND Year = $selected_year 
        AND Cost_Center_Category = $CCC 
        AND Cost_Center_Name = '$CC' 
        AND Cost_Center_Number = '$CC_Number'
        AND Location = '$location';";
        $update_result = $mysqli->query($labour_update);
    }

现在查阅准备好的报表!我听说它们不仅可以保护您不受sql注入的影响,还可以使这种性质的事情更快!谢谢你的帮助

我不想这样做,因为担心会产生讨厌的开销,但考虑到我实际上不会一次有很多更新/插入,我就这么做了

    $labour_select = "SELECT Project_ID 
                    FROM Labour_Planning 
                    WHERE Project_ID = $selected_project
                    AND Year = $selected_year 
                    AND Cost_Center_Category = $CCC 
                    AND Cost_Center_Name = '$CC' 
                    AND Cost_Center_Number = '$CC_Number'
                    AND Location = '$location';";
    $result = $mysqli->query($labour_select);
    $num_rows = mysqli_num_rows($result);
    if ($num_rows == 0){
        $labour_insert = "INSERT INTO Labour_Planning (Project_ID, Location, Cost_Center_Category, Cost_Center_Name, Cost_Center_Number, Year, $Q) VALUES ($selected_project, '$location', $CCC, '$CC', '$CC_Number', $selected_year, $submit)";
        $insert_result = $mysqli->query($labour_insert);
    }
    else {
        $labour_update = "UPDATE Labour_Planning 
        SET $Q = $submit
        WHERE Project_ID = $selected_project 
        AND Year = $selected_year 
        AND Cost_Center_Category = $CCC 
        AND Cost_Center_Name = '$CC' 
        AND Cost_Center_Number = '$CC_Number'
        AND Location = '$location';";
        $update_result = $mysqli->query($labour_update);
    }

现在查阅准备好的报表!我听说它们不仅可以保护您不受sql注入的影响,还可以使这种性质的事情更快!谢谢你的帮助

是的,使用唯一键是可行的,但在我看来,您最好将其重组为两个表。
在重复时
将触发任何“唯一键”冲突。这不仅适用于主键。是的,使用唯一键是可行的,但在我看来,您最好将重复的
重组为两个表
将触发任何“唯一键”冲突。这不仅仅是主键。