SQL получить названия поля с PRIMARY KEY

385
30 декабря 2016, 11:06

Есть произвольные таблицы и необходимо узнать название поля c PRIMARY KEY, как это можно сделать SQL (использую MySQL) запросом или средствами Python v3 и библиотечки PyMySQL?

Есть допустим табличка такой структуры:

CREATE TABLE `test` (
  `name` text,
  `this_id` int(11) NOT NULL,
  PRIMARY KEY (`this_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

И необходимо вернуть this_id

Answer 1
SELECT     pk.table_name, column_name as 'primary_key'
FROM       information_schema.table_constraints pk 
INNER JOIN information_schema.key_column_usage C 
                                    on c.table_name = pk.table_name  and
                                       c.constraint_name = pk.constraint_name
where   constraint_type = 'primary key'
           -- and pk.table_name  LIKE '%whatever%'
Answer 2

Немного изменил запрос от @L. Vadim:

-- Выводим значения поля COLUMN_NAME из таблице information_schema.TABLE_CONSTRAINTS
SELECT C.COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS AS pk
/*
Делаем INNER JOIN из-за того что нам нужны только пересечения полей:
  TABLE_NAME название таблицы,
  CONSTRAINT_NAME название поля с ключом 
  TABLE_SCHEMA название базы
*/
INNER JOIN information_schema.KEY_COLUMN_USAGE AS C ON
  C.TABLE_NAME = pk.TABLE_NAME AND
  C.CONSTRAINT_NAME = pk.CONSTRAINT_NAME AND
  C.TABLE_SCHEMA = pk.TABLE_SCHEMA
/* 
Условия:
  TABLE_NAME название таблицы,
  TABLE_SCHEMA название базы
  CONSTRAINT_TYPE поле где указан PRIMARY KEY
 */
WHERE  pk.TABLE_NAME  = 'test' AND pk.TABLE_SCHEMA = 'test_db'
  AND pk.CONSTRAINT_TYPE = 'PRIMARY KEY';

Вариант без комментариев:

SELECT C.COLUMN_NAME FROM information_schema.table_constraints AS pk INNER JOIN information_schema.KEY_COLUMN_USAGE AS C ON C.TABLE_NAME = pk.TABLE_NAME AND C.CONSTRAINT_NAME = pk.CONSTRAINT_NAME AND C.TABLE_SCHEMA = pk.TABLE_SCHEMA WHERE  pk.TABLE_NAME  = 'test' AND pk.TABLE_SCHEMA = 'test_db' AND pk.CONSTRAINT_TYPE = 'PRIMARY KEY';

Я не уверен в правельности текста ниже, так-как он был написан из быстрого изучения таблиц: information_schema.TABLE_CONSTRAINTS и information_schema.KEY_COLUMN_USAGE

Как я понял, в таблице information_schema.TABLE_CONSTRAINTS храниться информация о всех ключах для всех баз и соединяем их с таблицей information_schema.KEY_COLUMN_USAGE по полю CONSTRAINT_NAME где хранится название нашего ключа в нашем случаи это PRIMARY и уже в information_schema.KEY_COLUMN_USAGE находятся все поля с ключами, название поля в поле COLUMN_NAME

READ ALSO
Несколько методов на одну URL

Несколько методов на одну URL

Нужно написать API, и у клиента есть примеры запросов, которые должны быть

506
Связь ядра приложения Android с интерфейсом

Связь ядра приложения Android с интерфейсом

Только начал работать с Android и сразу наткнулся на проблему: как управлять элементами UI из других классов?

360
Микроконтроллеры и Java

Микроконтроллеры и Java

Интересует такой вопросДопустим, у меня есть какая-то кнопка, которая лежит на столе

1295