2016-11-21 92 views
0

我有一张从数据库表导入221行的表。每当我在HTML Table页面内动态地添加一行时,我希望它能够拉取MAX ID,所以在这种情况下为221,并将其添加1,因此将MR_ID设置为222.我需要这样做,因为每个ID都必须独一无二。每当我向表中添加一行并在数据库中查看它时,它都显示为NULL。我对此有点小小的想法,但似乎并没有奏效。如果您需要比我发布的任何更多的代码,请告诉我,我会提供。谢谢!在SQL Server中为自动递增ID设置MAX

<?php 

    $MR_ID = $_POST['MR_ID']; 
    $MR_Name = $_POST['MR_Name']; 
    $Buyer_ID = $_POST['Buyer_ID']; 
    $MR_POC_N = $_POST['MR_POC_N']; 
    $MR_POC_E = $_POST['MR_POC_E']; 
    $MR_POC_P = $_POST['MR_POC_P']; 

    $host="xxxxxxx"; 
    $dbName="xxxx"; 
    $dbUser="xxxxxxxxxxx"; 
    $dbPass="xxxxxxxxx"; 

    $pdo = new PDO("sqlsrv:server=".$host.";Database=".$dbName, $dbUser, $dbPass); 

    $MR_ID = "Select MAX(MR_ID) + 1 FROM Stage_Rebate_Master"; 
    $sql = "INSERT INTO Stage_Rebate_Master (MR_ID, MR_Name, Buyer_ID, MR_POC_N, MR_POC_E, MR_POC_P) VALUES (?, ?, ?, ?, ?, ?)"; 
    $stmt = $pdo->prepare($sql); 
    $result = $stmt->execute(array($MR_ID, $MR_Name, $Buyer_ID, $MR_POC_N, $MR_POC_E, $MR_POC_P)); 
    echo json_encode($result); 

?> 
+2

MAX + 1是受竞争条件。为什么不将MR_ID设置为标识或auto_increment并让DB处理它以避免竞争条件? – xQbert

+0

我确实有另一列自动递增以及可以用作实际的ID ....但是,这个MR_ID列用作查找整个数据库,所以我不能只有NULL值 – Rataiczak24

+0

似乎是一种奇怪的方式在非键值上关联表......我想你可以在更新之前使用触发器将MR_ID设置为自动递增的值。 (假设这个数据库管理系统使用触发器) – xQbert

回答

0

你可以尝试这样的

$sql = "INSERT INTO Stage_Rebate_Master (MR_ID, MR_Name, Buyer_ID, MR_POC_N, MR_POC_E, MR_POC_P) SELECT ISNULL(MAX(MR_ID)+1,1), ?, ?, ?, ?, ? FROM Stage_Rebate_Master"; 
$stmt = $pdo->prepare($sql); 
$result = $stmt->execute(array($MR_Name, $Buyer_ID, $MR_POC_N, $MR_POC_E, $MR_POC_P)); 
+0

每当我运行这个,我得到一个内部服务器错误...即时通讯猜测它与查询有关 – Rataiczak24