14

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

例如,我有一个名为的表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
}

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

检查字段是否设置为的最佳方法是UNIQUE什么PHP

编辑:没有重复并不意味着它UNIQUE有财产

4

3 回答 3

16

SHOW INDEX 的文档(由@diEcho 找到):

SHOW INDEX 返回以下字段:

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

Column_name -- 列名。

尝试:

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

请注意,这假定没有跨多个列的唯一索引。如果可以,那么您可能希望使用子查询排除这些。

另请注意,此查询中还会显示禁用索引(该Comment列的文档中提到了禁用索引的可能性)。似乎没有一列反映这一点,因此Comment如果您禁用了索引,您可能需要解析该列。

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

于 2012-12-27T05:08:34.360 回答
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;
    }
于 2012-12-27T04:59:39.990 回答
1

您可以检查所有索引列

SHOW INDEX

如果有一个UNIQUE索引,那么它不能是同一个表中的重复值但是一个 UNIQUE 索引允许可以包含 NULL 的列的多个 NULL 值

更新

在列上创建唯一约束(让电子邮件)使用下面的查询

  ALTER TABLE  `table_name` ADD UNIQUE (`email`);
于 2012-12-27T04:39:58.193 回答