Slightly changed the request from @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';
Option without comment:
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';
I am not sure of the text below, since it was written from a quick study of the tables: information_schema.TABLE_CONSTRAINTS and information_schema.KEY_COLUMN_USAGE
As I understand it, in the table information_schema.TABLE_CONSTRAINTS store information about all keys for all databases and connect them to the table information_schema.KEY_COLUMN_USAGE the field CONSTRAINT_NAME which stores the name of our key in this case and in PRIMARY information_schema.KEY_COLUMN_USAGE are all fields with the keys, field name in the field COLUMN_NAME
CREATE TABLE test (id bigint(20) NOT NULL, val int(11) NOT NULL, txt varchar(32) NOT NULL, PRIMARY KEY (id,txt(3),val)). What needs to be returned in this case? - Akina