SQL Server - id主键不自动递增

时间:2015-06-11 14:45:48

标签: php sql-server

我在sql server中有一个包含以下内容的简单表:

  • id(int) - 主键(标识规范:是,身份增量:1)
  • FirstName - varchar(50)
  • LastName - varchar(50)
  • email - varchar(50)

我已经设置了下面的html表单,将数据插入到这个非常简单的表中,该表出现以下错误:

<?php

require ('connect.inc.php');

if(ISSET($_POST['FirstName'])&&ISSET($_POST['LastName'])&&ISSET($_POST['email'])){
    if(!empty($_POST['FirstName'])&&!empty($_POST['LastName'])&&!empty($_POST['email'])){
        $FirstName = $_POST['FirstName'];
        $LastName = $_POST['LastName'];
        $email = $_POST['email'];
        $sql_insert = "SET IDENTITY_INSERT test.dbo.clients ON
                INSERT INTO test.dbo.clients (id, FirstName, LastName, email) 
                VALUES('', '$FirstName', '$LastName', '$email')";
        $sql_select = "SELECT * FROM test.dbo.clients";
        $sql_insert_query = odbc_exec($con, $sql_insert);       
        }
    else{
        echo "Please input fields";
        }
}
else{
    echo "Not set";
}

/*$sql = "INSERT INTO clients ()
        VALUES ()"
*/
?>

<html>
    <body>
        <table border="2">
            <form action="inputform.php" method="POST">
                <tr>
                    <td>First name:</td>
                    <td><input type="text" name="FirstName"></td>
                </tr>
                <tr>
                    <td>Last name:</td>
                    <td><input type="text" name="LastName"></td>
                </tr>
                <tr>
                    <td>e-mail:</td>
                    <td><input type="text" name="email"></td>
                </tr>
                <tr>
                    <td><input type="submit" name="submit" value="submit"></td>
                </tr>
            </form> 
        </table>
    </body>
</html>

以下错误表示id(PK)不是自动增量:

  

违反PRIMARY KEY约束'PK_clients'。无法插入   对象'dbo.clients'中的重复键。

附件是显示如何配置id键的图像。

提前致谢。 Ĵenter image description here

2 个答案:

答案 0 :(得分:3)

因为您尝试手动插入标识值。请注意启用它的位置:

SET IDENTITY_INSERT test.dbo.clients ON

请注意您的INSERT声明:

INSERT INTO test.dbo.clients (id, FirstName, LastName, email) 
VALUES('', '$FirstName', '$LastName', '$email')

数据库引擎将提供自动增量标识,除非您告诉它。这就是你在做什么。将空字符串插入数字列,插入空主键等都是非常糟糕的想法。

如果您希望数据库提供标识,请不要在代码中提供标识:

INSERT INTO test.dbo.clients (FirstName, LastName, email) 
VALUES('$FirstName', '$LastName', '$email')

此外,请注意您的代码 极易受攻击 SQL injection attacks。您将要使用预准备语句。目前,您目前正在允许用户在您的服务器上执行自己的代码

答案 1 :(得分:0)

没有太多的PHP。但改变这条线和&amp;让sql处理身份密钥值..

 $sql_insert = "
                INSERT INTO test.dbo.clients (FirstName, LastName, email) 
                VALUES('$FirstName', '$LastName', '$email')";