SQL使用不同的值更新多行,而不指定唯一键

时间:2012-09-25 19:24:20

标签: php sql sql-update

我需要帮助构建一个搜索user_id的SQL查询(假设user_id = 5),但是这个user_id有多个行条目,但我需要以不同的方式更新每一行。

我有一个数组,其中包含我要分配给该user_id的数据。这是一个表格示例:

id    user_id    amount    txn_id
1     5          10        foo_unique
2     5          5         bar_unique
3     7          15        xyz_unique
4     5          10        123_unique

我的数组看起来像这样:

Array (
    [0] => 14
    [1] => 6
    [2] => 9
)

如您所见,我有三个数组值和三行user_id 5,现在我想将该数组的每个值添加到相应的user_id(5)。请注意,我有一个名为txn_id

的UNIQUE列

更新表后,它看起来像这样:

id    user_id    amount    txn_id
1     5          14        foo_unique
2     5          5         bar_unique
3     7          6         xyz_unique
4     5          9         123_unique

我是如何实现这一目标的?

感谢。

P.S:我不能在这个问题上使用SQL CASE。

4 个答案:

答案 0 :(得分:2)

如果您想使用某个值更新一个行,则必须能够为该行设置唯一条件。< / p>

如果不添加额外的字段或条件来唯一标识一行,那你就不走运了。

答案 1 :(得分:0)

您可以使用以下查询:

UPDATE MyTable
SET
    amount = 
        CASE id 
            WHEN 1 THEN 14
            WHEN 2 THEN 6
            WHEN 3 THEN 9
            ELSE amount -- just in case user_id 5 has records not covered above.
        END
WHERE 
    user_id = 5

答案 2 :(得分:0)

问题是,您的阵列上没有任何内容表明哪个数组条目属于哪个数据库行。如果你只想依赖订单(数组索引和数据库id),你必须首先为用户SELECT所有行,然后循环并更新一行时间。在PHP(和PDO)上这样的东西:

$values = array(14, 6, 9);
$dbh = new PDO('mysql:host=localhost;dbname=yourdbname', 'username', 'password');
$selectQuery = 'SELECT id FROM yourtable WHERE user_id = 5 ORDER BY id';
foreach($dbh->query($selectQuery) as $row) {
    $id = $row['id'];
    $sth = $dbh->prepare("UPDATE yourtable SET amount = :val WHERE id = :id");
    $sth->execute(array(
        'val' => array_unshift($values),
        'id' => $id
    ));
}

(上面的代码假设数组中的值数与user_id = 5的数据库行数相匹配。)

答案 3 :(得分:0)

查看问题,您只需要拥有SQL语句。

首先是创建两个表

CREATE TABLE users 
  user_id int(11) PRIMARY KEY NOT NULL,
  username varchar(25),
) Engine = InnoDB;

CREATE table userbalances (
  balance_id int(11) PRIMARY KEY NOT NULL,
  user_id int(11),
  amount decimal(10,2),
  CONSTRAINT userid_fk FOREIGN KEY userid_fk(user_id) REFERENCES users(userid)
) Engine = InnoDB;

然后,在INSERT(ed)表中的所有用户和用户权限之后,您需要做的只是创建UPDATE语句来更新金额:

UPDATE userbalances SET amount=? WHERE user_id=? AND balanceid=?

更新应该循环。您应该使用 mysql_query()函数使用您拥有的已分配数组更新它。

注意: 用户ID balanceid 都应位于UPDATE语句的WHERE子句中,因为 userbalances 中有多个事务表。否则,它将改变该用户的所有交易的所有余额。

问题更新: 如果您不对此问题使用任何SQL案例,那么您的问题只是PHP。您需要找出UPDATE(ing)的功能 - 更新金额。只要你的桌子全部预先填充。用于更新它的程序可能有一个函数。