2

我正在开发一个小的爱好应用程序。虽然我以前使用过 MySQL 和 PostgreSQL,但我在这里更像是一个 n00b,希望能得到任何帮助。

我的 MySQL 数据库中有一个名为“TECH”的表。该表有两列:“ID”(主键)和“名称”(技术名称 - 不是任何类型的键)。以下是几个示例行:

+----+--------+
| ID |  name  |
+----+--------+
| 1  |  Python|
| 2  |  ASP   |
| 3  |  java  |
+----+--------+

这是创建的代码TECH

CREATE TABLE TECH (
        id      INT(5) ,
        name    VARCHAR(20),
        PRIMARY KEY (id)
);

我开发了一个 html 表单供用户输入新技术到TECH. 但是,我想确保TECH. 例如,不应允许用户输入“Python”以分配 ID 4。此外,也不应允许用户在另一个 ID 处输入“pYthon”(或任何大写变体)。

目前,我有以下代码(在 PHP 端,而不是 MySQL 端):

// I discovered that MySQL is not case sensitive with TECH.name
$rows = 0;
$result = $mysql_query("SELECT * FROM tech AS T WHERE T.name='python'");
while ($row = mysql_fetch_array($result)) {
    $rows += 1;
}

if ($rows != 0) {
    echo "'python' cannot be inserted as it already exists";
} else {
    // insertion code
}

现在,我知道执行此操作的正确方法是通过UNIQUE (name)在 PHP 端执行并捕获“插入错误”来将 TECH.name 约束为 UNIQUE。但是,关于这个过程,我有以下两个问题:

  1. 定义 UNIQUE 约束是否保持上述明显的不区分大小写?
  2. 如何在 PHP 端准确捕获这样的插入错误?

我将不胜感激这方面的任何帮助或任何人的任何更好的想法。

4

3 回答 3

2

当您从 php 操作 mysql 时(即通过执行 INSERT 或 UPDATE),您可以调用 mysql_get_rows_affected 它将返回受影响的行。如果查询由于 UNIQUE 约束而失败,则受影响的行将为 0

http://php.net/manual/en/function.mysql-affected-rows.php

我通常检查从该函数返回的行数,如果您采用 INSERT OR IGNORE 方法,则可以应用相同的检查

于 2012-08-20T14:27:19.957 回答
1

尝试

INSERT IGNORE INTO mytable
    (primaryKey, field1, field2)
VALUES
    ('abc', 1, 2),
    ('def', 3, 4),
    ('ghi', 5, 6);

重复的行将被忽略

于 2012-08-20T14:28:08.177 回答
0

将字段的排序规则更改为_cior_cs将确定唯一键是否c敏感ic敏感s

至于捕获错误,您应该尝试使用 mysqli 或 PDO 来运行数据库查询:http ://www.php.net/manual/en/pdo.exec.php

您可以使用 PDO 捕获重复的错误条目,如下所示:

try
{
    $dbh->exec($mySqlQuery);
    // insert was successful...
} catch (PDOException $e) {
    if ($e->errorInfo[1]==1062) {
        // a 'duplicate' error occurred...
    } else {
        // a non 'duplicate error' occurred...
    }
}

编辑:

如果你不使用 PDO,这应该在你的 mysql_query 之后工作:

if (mysql_errno() == 1062)
{
   // you have a duplicate error...
}
于 2012-08-20T14:34:45.580 回答