检查mysql和PHP中的字段是否具有`UNIQUE`属性

14

如何检查表中的字段是否设置为唯一

例如,我有一个名为users的表,其中的email字段被设置为UNIQUE,而picture字段未被设置为UNIQUE。在进行选择操作之前,我想检查该字段是否设置为UNIQUE,如果没有,则不执行SELECT操作。

我尝试过先执行SELECT语句,再计算返回的行数,如果超过1行则说明不是UNIQUE

"SELECT * FROM table WHERE email='$email'"
//...some mysql php line later
if($count > 1){
    //return nothing
}

但这并不高效,如果没有重复怎么办。

如何最好地检查一个字段是否设置为UNIQUEPHP中?

编辑:无重复并不意味着它具有UNIQUE属性。


你可以通过 phpmyadmin 进行检查。 - xkeshav
3
你的代码应该已经知道一个字段是否有唯一约束,否则就是对自己的应用程序进行逆向工程。 - Ja͢ck
基本上,我有一个搜索函数,结果应该是唯一的(有点像一个短标识符),例如 username=bob email=boby@dgf.fg,但如果用户名不唯一,则用户无法通过用户名进行搜索,我会抛出一个错误。 - Jonathan de M.
3个回答

16

根据@diEcho提供的信息,从SHOW INDEX文档中可以知道:

SHOW INDEX 返回以下字段:

Non_unique -- 如果索引不包含重复值,则为0,如果可以包含则为1。

Column_name -- 列名。

尝试:

SHOW INDEXES
FROM $tablename
WHERE Column_name='$field'
AND NOT Non_unique

需要注意的是,此假设假定不存在跨越多列的唯一索引。如果存在这种情况,则可能需要使用子查询来排除这些索引。

还要注意,此查询中还显示了禁用的索引(在“注释”列中提到了禁用索引的可能性)。似乎没有反映这一点的列,因此如果您有禁用的索引,则可能需要解析“注释”列。

无需将Non_unique与数字进行比较 - 无论如何MySQL都使用0和1表示布尔值


@marc 我相信你不是故意颠倒逻辑的吧?至少解释一下呗? - John Dvorak
啊,我的错,抱歉。我对“NOT”感到困惑了。我道歉。 - Marc-André Lafortune

2

好的,我找到了,感谢 @diEcho 的帮助。

public function isUniqueField($tablename, $field, $connection){
        $query = $connection->query("SHOW INDEXES FROM $tablename WHERE Column_name='$field' AND Non_unique=0");
        $query->execute();
        if(!$query->fetchAll()){
            return false;
        }
        return true;
    }

仅仅因为有一个索引并不意味着它是唯一的索引。你还需要检查一下。 - John Dvorak
SHOW INDEX 返回以下字段: Non_unique -- 如果索引不能包含重复项,则为0,如果可以,则为1。 Key_name -- 索引的名称。如果索引是主键,则名称始终为PRIMARY。 Column_name -- 列名。 - John Dvorak

1

您可以使用以下命令检查所有已索引的列:

SHOW INDEX

如果存在唯一索引,则在同一表中不能有重复值,但是唯一索引允许对可以包含NULL的列进行多个NULL值。

更新

要在列(例如电子邮件)上创建唯一约束,请使用以下查询:

  ALTER TABLE  `table_name` ADD UNIQUE (`email`);

我需要在PHP中返回true或false。 - Jonathan de M.
即使该字段未重复,只要将该字段设置为UNIQUE,我希望它返回唯一的值。 - Jonathan de M.
我不明白你的意思,JonathandeM。 - xkeshav
我想要的不是一个没有重复的字段,而是一个具有“UNIQUE”属性的字段。 - Jonathan de M.
好的,你想在一列上创建一个唯一约束?我说得对吗? - xkeshav
我不想创建,只想检查该字段是否具有“UNIQUE”属性,请查看我的答案。 - Jonathan de M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接