【问题标题】:Inserting ID in to SQL table, problem with same ID number将 ID 插入 SQL 表,ID 号相同的问题
【发布时间】:2019-07-04 12:08:30
【问题描述】:

我不想将 SQL Server 表的 ID 号设置为自动递增。所以我在我的 PHP 程序中设置了这个数字。我这样做的方法是获取表的当前 ID 值,然后对其添加+1,并将此数字插入表中。

示例:

$query = "SELECT MAX(ID) FROM T01"; 
$result=sqlsrv_query($conn, $query);
$IDTable = sqlsrv_fetch_array($result);

$Column1= getPOST('Column1' . $column); 
$Column2= getPOST('Column2' . $Column);
$ID1 = $IDTable[0]+1;
$params = array(&$ID1,&$Column1,&$Column2);

# Statement
$sql = "INSERT INTO MyTable ([ID],[Column1],[Column2]) VALUES (?,?); SELECT SCOPE_IDENTITY();";

现在我有一个表格,在那个表格中,可以在 SQL 表(MyTable)中插入多于 1 行。现在发生的问题是,使用下面的代码会为所有插入的行提供相同的 ID。因此我收到一个错误,说重复的 ID 值。

我该如何克服这个问题?

【问题讨论】:

  • 有什么理由不使用IDENTITY()
  • 如果你总是将 id 加一,你可以使用自动递增的 id
  • 不要获取 MAX 值并插入 +1。使用IDENTITY 属性或SEQUENCE.
  • 所以如果这个应用程序的 2 个实例同时执行此操作,是否可以生成相同的密钥?也许这就是为什么 identitysequences 在哪里创建的?为什么不使用它们?
  • 我可以将 IDENTITY() 用于表中的 ID 列,但我在自动增加 ID 时遇到了一些问题,我想在程序中尝试一下。

标签: php sql-server database sql-insert


【解决方案1】:
  1. 确保您插入的每条记录都有时间戳
  2. 选择最后插入的记录。
  3. 根据id,可能是字符串,所以从字符串中获取整数。
  4. 将得到的字符串加1,得到增量值。
  5. 为递增的整数添加前缀,即 T23。
  6. 将其保存到变量中,并将其作为任何其他变量插入。

    //assume $dbc to be the variable referencing the database connection
    //fetch last id
    $select_last_id_sql = mysqli_query($dbc,"SELECT table_id,time_recorded FROM TableName ORDER BY time_recorded DESC LIMIT 1") or die(mysqli_error($dbc);
    
    $id_row = mysqli_fetch_array($select_last_id_sql);
    $id = $id_row['table_id'];
    $int = (int) filter_var($id, FILTER_SANITIZE_NUMBER_INT);
    $int = $int+1;
    $new_table_id = "T".$int;
    

【讨论】:

  • 在代码中使用die(mysqli_error($conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
相关资源
最近更新 更多