在mySQL中检索表信息

时间:2017-05-18 23:59:59

标签: mysql sql

ALL,

我刚试过以下查询:

SELECT cols.column_name, cols.data_type, cols.character_maximum_length, cols.character_octet_length,
       cols.numeric_precision, cols.numeric_scale, cols.column_default, cols.is_nullable, 
       cols.ordinal_position, kcu.column_name
FROM information_schema.columns cols, information_schema.key_column_usage kcu
WHERE kcu.constraint_name = 'PRIMARY' AND kcu.table_schema = cols.table_schema AND
      kcu.table_name = cols.table_name AND cols.table_schema = 'draft' AND cols.table_name = 'leagues';

该查询的最后一列确实返回主键列名称。

但是,我想看到的是:

  • 如果列是主键,则查询将在最后一个查询列中输出“1”。

  • 如果列不是主键,则查询将在最后一个查询列中输出“0”。

mySQL中是否有一个函数可以帮助我做到这一点?

谢谢。

3 个答案:

答案 0 :(得分:0)

从不FROM子句中使用逗号。 始终使用正确的JOIN语法。

“功能”是case

SELECT cols.column_name, cols.data_type, cols.character_maximum_length, cols.character_octet_length,
       cols.numeric_precision, cols.numeric_scale, cols.column_default, cols.is_nullable, 
       cols.ordinal_position,
       (CASE WHEN kcu.column_name IS NULL THEN 0 ELSE 1 END) as pk_flag
FROM information_schema.columns cols LEFT JOIN
     information_schema.key_column_usage kcu
     ON kcu.constraint_name = 'PRIMARY' AND kcu.table_schema = cols.table_schema AND
        kcu.table_name = cols.table_name
WHERE cols.table_schema = 'draft' AND cols.table_name = 'leagues';

答案 1 :(得分:0)

这是我将使用的查询:

SELECT cols.column_name, cols.data_type, cols.character_maximum_length, cols.character_octet_length,
       cols.numeric_precision, cols.numeric_scale, cols.column_default, cols.is_nullable, 
       cols.ordinal_position, 
       (CASE WHEN kcu.column_name = cols.column_name THEN 1 ELSE 0 END) as pk_flag
FROM information_schema.columns cols, information_schema.key_column_usage kcu
WHERE kcu.constraint_name = 'PRIMARY' AND kcu.table_schema = cols.table_schema AND
      kcu.table_name = cols.table_name AND cols.table_schema = 'draft' AND cols.table_name = 'leagues';

它在mySQL Workbench中按预期工作。

答案 2 :(得分:0)

注意:这不是您问题的答案。

@Igor,这是我在两个表(FROM,resp。table1)上使用table2运行选择查询的测试,与{{1}调用的select命令相比较 - 相同的表格。

正如您所提到的,确实存在差异:LEFT JOIN - ing意味着表之间存在一个或多个关系,但LEFT JOIN - 不存在(在上下文中)。

我的问题是,为什么/不应该提取来自不相关表的数据?


表格创建:

FROM


值插入:

-- Create table1 table.
CREATE TABLE `tests`.`table1` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NULL,
  PRIMARY KEY (`id`));

-- Create table2 table.
CREATE TABLE `tests`.`table2` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NULL,
  PRIMARY KEY (`id`));


表格预览:

table1 preview

table2 preview


-- Insert values into table1 table. INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('1', 'TAB1 1'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('2', 'TAB1 2'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('3', 'TAB1 3'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('4', 'TAB1 4'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('5', 'TAB1 5'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('6', 'TAB1 6'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('7', 'TAB1 7'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('8', 'TAB1 8'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('9', 'TAB1 9'); INSERT INTO `tests`.`table1` (`id`, `name`) VALUES ('10', 'TAB1 10'); -- Insert values into table2 table. INSERT INTO `tests`.`table2` (`id`, `name`) VALUES ('1', 'TAB2 1'); INSERT INTO `tests`.`table2` (`id`, `name`) VALUES ('2', 'TAB2 2'); INSERT INTO `tests`.`table2` (`id`, `name`) VALUES ('3', 'TAB2 3'); 查询&结果

Query 1


FROM查询&结果

Query 2