【问题标题】:Check whether a field has the property `UNIQUE` in mysql and PHP在 mysql 和 PHP 中检查字段是否具有属性 `UNIQUE`
【发布时间】:2012-12-12 12:46:24
【问题描述】:

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

例如,我有一个名为users 的表,其中一个字段email 设置为UNIQUE,而一个字段picture 未设置为UNIQUE,我想在选择之前检查该字段是否设置为@ 987654326@ 如果没有,请不要使用SELECT

我尝试SELECT然后计算返回的行数,如果超过1则不是UNIQUE

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

但是效率不高,如果没有重复呢。

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

编辑:没有重复并不意味着它有UNIQUE 属性

【问题讨论】:

  • 您也可以通过phpmyadmin查看
  • 你的代码应该已经知道一个字段是否有唯一的约束;其他任何事情都只是对您自己的应用程序进行逆向工程。
  • 基本上我有一个搜索功能,结果应该是唯一的(有点像蛞蝓),比如username=bobemail=boby@dgf.fg,但如果用户名不是唯一的,那么用户就不能做按用户名搜索,我会抛出一个错误。

标签: php mysql indexing unique-index


【解决方案1】:

您可以使用

检查所有索引列

SHOW INDEX

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

更新

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

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

【讨论】:

  • 我需要在php中返回true或false
  • 我希望它返回唯一,即使该字段不重复,只要该字段已设置为 UNIQUE
  • 乔纳森德M,我没有告诉你。
  • 我想要的不是一个不重复的字段我想要一个属性为UNIQUE的字段
  • 好的,所以你想在列上创建一个 UNIQUE 约束?我说得对吗
【解决方案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;
    }

【讨论】:

  • 存在索引并不意味着存在唯一索引。你也需要检查一下。
  • SHOW INDEX returns the following fields: Non_unique -- 0 if the index cannot contain duplicates, 1 if it can. Key_name -- The name of the index. If the index is the primary key, the name is always PRIMARY. Column_name -- The column name.
【解决方案3】:

来自documentation of 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 uses 0 and 1 for booleans anyways

【讨论】:

  • @marc 我很确定你不是想颠倒逻辑?至少不用解释一个字?
  • 啊,我的错,对不起。我对NOT 感到困惑。我的道歉^2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2020-06-03
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多