【问题标题】:Primary key violation does not raise error in PHP主键违规不会在 PHP 中引发错误
【发布时间】:2015-09-11 05:42:39
【问题描述】:

我正在使用带有sqlsrv_query 的 PHP,并且遇到了一个问题,即 SQL 错误不是...导致错误。

比如这段代码中user_id 1已经存在

$sqlresult = sqlsrv_query($db_conn, "INSERT into dbo.users( user_id, name)
                VALUES( 1, 'Adam');");
if( $sqlResult === false ) {
    echo "\nSQL result indicated a failure\n";
    die(  print_r( sqlsrv_errors(), true));
}   

$sqlresult 不为假,尽管 sql 查询因主键冲突而失败。

SQL Studio 显示如下

Msg 2627, Level 14, State 1, Line 2
Violation of PRIMARY KEY constraint 'PK_users'. Cannot insert duplicate key in object 'dbo.users'. The duplicate key value is (1).
The statement has been terminated.

如果我尝试使用错误数据类型的 INSERT,即 user_id 的“xyz”,我看不到“语句已终止。”。如果从 PHP 执行,$sqlresult 是正确的 false。

需要修复主键违规问题,但我担心某些“类型”的错误会被默默忽略。

任何想法为什么一种类型的错误与另一种错误不同?

【问题讨论】:

  • 我认为这与使用的驱动程序有关。 sqlsrv_query 没有出现在 PHP 手册中,这意味着它不是 PHP 的官方库或驱动程序。这使得库和/或驱动程序的开发人员负责。
  • 我可以想象。但也许 sql studio 返回带有 PK 违规错误但不是数据类型错误的“语句终止”的方式有线索?
  • 我实际上刚刚实现了一个新表,发现 PK 违规正确返回 $sqlresult 为 false。所以我不知道发生了什么,我得回去调查一下。

标签: php sql-server


【解决方案1】:

user_id 列可能是dbo.users 表中的主键。因此它不接受重复值。

有多种方法可以处理此问题。

  1. 确保user_id 不在表中。就像是 MAX(user_id) + 1
  2. user_id 列设为AUTOINCREMENT,这样您就不必担心下一个ID 并更改您的插入查询这样 INSERT into dbo.users(name) VALUES('Adam')

我更喜欢以第二种方式(使用 AUTOINCREMENT)实现,这是一种更简洁的方法。

【讨论】:

  • 在drupal hook_schema中,“serial”类型用于获取数据库中的AUTOINCREMENT。例如'user_id' => array( 'description' => 'user_id', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, )
  • SQL Server 没有AUTOINCREMENT,如果需要可以使用IDENTITYSEQUENCE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2012-04-27
  • 1970-01-01
  • 2020-02-23
  • 2017-04-28
  • 1970-01-01
相关资源
最近更新 更多