3

Мне нужен запрос (INFORMATION_SCHEMA), который для данного имени схемы и таблицы показывает мне все столбцы таблицы со следующими атрибутами (какой тип ключа: PK => Primary Key, UQ = > Уникальный ключ, FK => Внешний ключ, что имя ключа, и если это внешний ключ, что schema.table.column ссылается):Отображение столбцов таблицы MYSQL с типами ключей и ссылкой

COLUMN_NAME | DATA_TYPE | KEY_TYPE | KEY_NAME | REFERENCED 
============+===========+==========+=============+======================== 
empid  | int  | PK  | PRIMARY  | 
empname  | varchar | UQ  | uq_empname | 
empactive | enum  |   |    | 
empcatid | int  | FK  | fk_emp_cat | schema.categories.catid 

Это мой SQL:

SELECT c.COLUMN_NAME, 
     c.COLUMN_KEY, 
     c.DATA_TYPE, 
     k.REFERENCED_TABLE_SCHEMA, 
     k.REFERENCED_TABLE_NAME, 
     k.REFERENCED_COLUMN_NAME 
FROM information_schema.COLUMNS c 
LEFT JOIN information_schema.KEY_COLUMN_USAGE k 
    ON (k.TABLE_SCHEMA=c.TABLE_SCHEMA 
     AND k.TABLE_NAME=c.TABLE_NAME 
     AND k.COLUMN_NAME=c.COLUMN_NAME 
     AND k.POSITION_IN_UNIQUE_CONSTRAINT IS NOT NULL) 
WHERE c.TABLE_SCHEMA='PHPDAO' 
     AND c.TABLE_NAME='employees'; 

Вот мои ТАБЛИЦЫ:

-- ----------------------------------------------------- 
-- Table `PHPDAO`.`categories` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `PHPDAO`.`categories` (
    `catid` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `catname` VARCHAR(50) NOT NULL, 
    `catgroup` ENUM('A', 'B', 'C') NOT NULL DEFAULT 'A', 
    PRIMARY KEY (`catid`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `PHPDAO`.`employees` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `PHPDAO`.`employees` (
    `empid` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `empname` VARCHAR(100) NOT NULL, 
    `empactive` ENUM('Y', 'N') NOT NULL DEFAULT 'Y', 
    `empcatid` INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`empid`), 
    INDEX `fk_emp_cat_idx` (`empcatid` ASC), 
    UNIQUE INDEX `uq_empname` (`empname` ASC), 
    UNIQUE INDEX `uq_empid` (`empid` ASC), 
    CONSTRAINT `fk_emp_cat` 
    FOREIGN KEY (`empcatid`) 
    REFERENCES `PHPDAO`.`categories` (`catid`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 
+0

Я попытался с некоторыми объединениями, но всегда получаю несколько строк для некоторых столбцов. – sbrbot

+0

Проблема в том, что в моем столбце первичного ключа есть ограничения PRIMARY KEY и UNIQUE KEY в одно и то же время, поэтому, возможно, мне нужно будет сделать этот запрос и отобразить отдельно столбцы PK/FK и UQ. – sbrbot

ответ

0

Это мой последний (pivotized) запрос:

SELECT c.COLUMN_NAME, 
     --c.COLUMN_KEY, 
     IF(EXISTS(select * 
       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_SCHEMA=c.TABLE_SCHEMA 
         AND k.TABLE_NAME=c.TABLE_NAME 
         AND tc.CONSTRAINT_TYPE='PRIMARY KEY' 
         AND c.COLUMN_NAME=k.COLUMN_NAME),'PK',null) AS PK, 
     IF(EXISTS(select * 
       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_SCHEMA=c.TABLE_SCHEMA 
         AND k.TABLE_NAME=c.TABLE_NAME 
         AND tc.CONSTRAINT_TYPE='UNIQUE' 
         AND c.COLUMN_NAME=k.COLUMN_NAME),'UQ',null) AS UQ, 
     IF(EXISTS(select * 
       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_SCHEMA=c.TABLE_SCHEMA 
         AND k.TABLE_NAME=c.TABLE_NAME 
         AND tc.CONSTRAINT_TYPE='FOREIGN KEY' 
         AND c.COLUMN_NAME=k.COLUMN_NAME),'FK',null) AS FK, 
     c.EXTRA, 
     c.IS_NULLABLE, 
     c.DATA_TYPE, 
     c.COLUMN_TYPE, 
     c.CHARACTER_MAXIMUM_LENGTH, 
     c.COLUMN_COMMENT, 
     k.REFERENCED_TABLE_SCHEMA, 
     k.REFERENCED_TABLE_NAME, 
     k.REFERENCED_COLUMN_NAME 
FROM information_schema.COLUMNS c 
LEFT JOIN information_schema.KEY_COLUMN_USAGE k 
    ON (k.TABLE_SCHEMA=c.TABLE_SCHEMA 
    AND k.TABLE_NAME=c.TABLE_NAME 
    AND k.COLUMN_NAME=c.COLUMN_NAME 
    AND k.POSITION_IN_UNIQUE_CONSTRAINT IS NOT NULL) 
WHERE c.TABLE_SCHEMA='PHPDAO' 
    AND c.TABLE_NAME='employees'; 

Но я думаю, что там должно быть простое решение.

 Смежные вопросы

  • Нет связанных вопросов^_^