具有单个 UNIQUE 约束指示符的 MySQL 列名

标签 mysql information-schema

我需要一个查询,如果该列存在 UNIQUE 约束,则(对于给定的表名)显示带有指示符的列列表,但仅当该列是单列约束时,而不是如果该列是多列约束的一部分.

例如这张表:

CREATE TABLE IF NOT EXISTS `prices` (
  `priceId` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `motorcycleId` INT UNSIGNED NOT NULL,
  `priceDatum` DATE NOT NULL,
  `price` INT NOT NULL DEFAULT 0,
  PRIMARY KEY (`priceId`),
  INDEX `price_motorcycleId_fk_idx` (`motorcycleId` ASC),
  UNIQUE INDEX `priceId_UNIQUE` (`priceId` ASC),
  UNIQUE INDEX `price_UNIQUE` (`motorcycleId` ASC, `priceDatum` ASC),
  CONSTRAINT `price_motorcycleId_fk`
    FOREIGN KEY (`motorcycleId`)
    REFERENCES `motorcycles` (`motorcycleId`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

这个查询应该给出:

COLUMN      |UNIQUE
============+======
priceId     |  Y
motorcycleId|  N    <-- should not be shown as UNIQUE since not single constraint
priceDatum  |  N    <-- should not be shown as UNIQUE since not single constraint
price       |  N

最佳答案

您不应该只检查是否存在这样的约束,还应该检查该约束是否只有一列。因此,KEY_COLUMN_USAGE 中该约束的计数应为 1。

目前我无法对其进行测试,但它应该看起来像这样来获取具有此类约束的列。您可以在子查询中做类似的事情,或者只是在所有列的列表中加入此查询并检查:如果记录存在,则存在唯一的单列约束,否则不存在。

select
  k.COLUMN_NAME 
from 
  information_schema.KEY_COLUMN_USAGE k
  join information_schema.TABLE_CONSTRAINTS tc
    on k.TABLE_SCHEMA = tc.TABLE_SCHEMA
      and k.TABLE_NAME = tc.TABLE_NAME
      and k.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
where
  k.TABLE_NAME = 'prices'
  and tc.CONSTRAINT_TYPE = 'UNIQUE'
group by
  k.CONSTRAINT_CATALOG,
  k.CONSTRAINT_SCHEMA,
  k.CONSTRAINT_NAME
having
  count(*) = 1

关于具有单个 UNIQUE 约束指示符的 MySQL 列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47782926/

相关文章:

php - 何时以及如何通过 PHP (PDO) 使用多个 MySQL 查询

c# - 我想使用 LoadAsync 和 MemoryStream 将数据库中的图像加载到图片框中

C# MySQLDataReader 为所有行返回相同的字符串

mysql - 如何从 Postgresql 检索外键信息

xml - 表示数据库模式的标准文件格式

postgresql - 如何反射(reflection)物化 View

php - mySQL time sum php now() in laravel seed

PHP mysql_query - 获取当前星期与当前日期的行

sql - 查找名称以某个后缀结尾的所有表

mysql - 我可以执行一个只返回与通配符匹配的列的数据的查询吗?