Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让PostgreSQL给我MySQL显示类似结果的列?_Sql_Postgresql_Information Schema - Fatal编程技术网

如何让PostgreSQL给我MySQL显示类似结果的列?

如何让PostgreSQL给我MySQL显示类似结果的列?,sql,postgresql,information-schema,Sql,Postgresql,Information Schema,在经历了很多麻烦之后,我很接近了(看在我的份上,我不在乎类型差异)。但是,我确实想要与MySQL完全相同的输出格式。原因是我正在尝试将MySQL专用工具改编为PostgreSQL。下面是MySQL的一个输出示例(尽管列数较少): 这是我正在测试的表: Table "public.users" Column | Type | Collation | Nullable | Default

在经历了很多麻烦之后,我很接近了(看在我的份上,我不在乎类型差异)。但是,我确实想要与MySQL完全相同的输出格式。原因是我正在尝试将MySQL专用工具改编为PostgreSQL。下面是MySQL的一个输出示例(尽管列数较少):

这是我正在测试的表:

Table "public.users"
       Column       |          Type          | Collation | Nullable |              Default              
--------------------+------------------------+-----------+----------+-----------------------------------  
id                  | integer                |           | not null | nextval('users_id_seq'::regclass) 
name                | character varying(255) |           |          |   
role_id             | integer                |           |          |   
image_url           | character varying(510) |           |          |   
institution         | character varying(255) |           |          |  
qualifications      | text                   |           |          |   
cv_url              | character varying(510) |           |          |   
specializations     | text                   |           |          |   
text_collaboration  | text                   |           |          |  
Indexes:
    "users_pkey" PRIMARY KEY, btree (id) Check constraints:
    "users_name_not_null" CHECK (name IS NOT NULL) Foreign-key constraints:
    "fk_role_id" FOREIGN KEY (role_id) REFERENCES roles(id) Referenced by:
    TABLE "novel_reviews" CONSTRAINT "novels_reviewer_id_fkey" FOREIGN KEY (reviewer_id) REFERENCES users(id)
    TABLE "review_translations" CONSTRAINT "review_translations_recorder_id_fkey" FOREIGN KEY (recorder_id) REFERENCES users(id)
这是我的疑问。。。这可能做得很差,尤其是在分组时:

SELECT column_name AS "Field"
       , data_type AS "Type"
       , is_nullable AS "Null"
       , CASE WHEN is_primary=true THEN 'PRI' ELSE NULL END AS "Key"
       , column_default as "Default"
       , CASE WHEN column_default LIKE 'nextval(%' THEN 'auto_increment' ELSE '' END AS "Extra" 
FROM
(
    SELECT c.column_name
           , c.data_type
           , c.is_nullable
           , tc.constraint_type='PRIMARY KEY' AS is_primary
           , c.column_default 
    FROM information_schema.columns AS c 
    LEFT JOIN information_schema.constraint_column_usage AS ccu USING (column_name, table_name) 
    LEFT JOIN information_schema.table_constraints tc USING (constraint_name) 
    WHERE c.table_name = 'users'
    GROUP BY c.column_name
             , c.data_type
             , c.is_nullable
             , is_primary
             , c.column_default
) as sq;
这是我目前得到的结果。很抱歉格式不好

>        Field        |       Type        | Null | Key |              Default              |     Extra      
> --------------------+-------------------+------+-----+-----------------------------------+----------------  
> |   cv_url          | character varying | YES  |     |                 
> |   id              | integer           | NO   |     | nextval('users_id_seq'::regclass) | auto_increment  
> |   id              | integer           | NO   | PRI | nextval('users_id_seq'::regclass) | auto_increment  
> |   image_url       | character varying | YES  |     | 
> |   institution     | character varying | YES  |     |             
> |   name            | character varying | YES  |     |             
> |   qualifications  | text              | YES  |     |             
> |   role_id         | integer           | YES  |     |             
> |   specializations | text              | YES  |     |             
> | 
> |  (10 rows)
我不知道如何让id的第二次出现消失,即从非primarykey约束发出的id。我不知道该怎么扔掉它。我尝试过执行
其中is_primary_key为NULL或is_primary_key=TRUE
,但这也会删除
Name
字段,该字段与一个也不是主键的约束相连接

我想要的是从表中获取所有列(每个列仅一次),如果字段是主键,则获取字符串“PRI”


救命啊!我有点不知所措。谢谢。

这是您需要的查询:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'public'
  AND table_name   = 'users'

在我的头重重地撞在墙上之后,我终于明白了。首先我提出一个观点:

CREATE VIEW table_column_constraints as (SELECT c.table_schema, c.table_name, c.column_name
           , c.data_type
           , c.is_nullable
           , tc.constraint_type              
           , c.column_default 
    FROM information_schema.columns AS c 
    LEFT JOIN information_schema.constraint_column_usage AS ccu USING (column_name, table_name) 
    LEFT JOIN information_schema.table_constraints tc ON tc.constraint_name=ccu.constraint_name WHERE c.table_schema='public');
然后,我使用重复数据消除技术将表与自身进行比较:

SELECT column_name as "Field" 
           , data_type AS "Type"
           , is_nullable AS "Null"
           , CASE WHEN constraint_type='PRIMARY KEY' THEN 'PRI' ELSE NULL END AS "Key"              
           , column_default AS "Default", CASE WHEN column_default LIKE 'nextval(%' THEN 'auto_increment' ELSE '' END AS "Extra" 
    FROM table_column_constraints as given WHERE given.table_name = 'users'  
    AND NOT EXISTS (SELECT * FROM table_column_constraints other WHERE other.column_name=given.column_name AND given.constraint_type!='PRIMARY KEY' AND other.constraint_type='PRIMARY KEY');
要获得以下结果:

       Field        |       Type        | Null | Key |              Default              |     Extra      
--------------------+-------------------+------+-----+-----------------------------------+----------------
 name               | character varying | YES  |     |                                   | 
 id                 | integer           | NO   | PRI | nextval('users_id_seq'::regclass) | auto_increment
 image_url          | character varying | YES  |     |                                   | 
 institution        | character varying | YES  |     |                                   | 
 qualifications     | text              | YES  |     |                                   | 
 cv_url             | character varying | YES  |     |                                   | 
 specializations    | text              | YES  |     |                                   | 
 text_collaboration | text              | YES  |     |                                   | 
 role_id            | integer           | YES  |     |                                   | 
(9 rows)

我的灵感来源于一个题为“选择按某列排序并在另一列上不同的行”

的问题,首先使用
-E
开关运行
psql
,它将响应各种反斜杠命令后面的所有SQL。然后您可以
\d users
查看
psql
用于描述
users
表的SQL。这很有趣。我设法找到了正在运行的查询来生成它。然而,postgres在其
\d
命令中没有指示“Key”或主键约束或类似内容的列,因此它不是直接帮助。编辑:我想它确实有索引。但是,我仍然需要弄清楚如何组合这些信息。不,因为我想知道列是否是主键,这就需要我在上面使用的连接,导致我不想要的重复。我只需要一种方法来选择DISTINCT并确保主键先出现。
       Field        |       Type        | Null | Key |              Default              |     Extra      
--------------------+-------------------+------+-----+-----------------------------------+----------------
 name               | character varying | YES  |     |                                   | 
 id                 | integer           | NO   | PRI | nextval('users_id_seq'::regclass) | auto_increment
 image_url          | character varying | YES  |     |                                   | 
 institution        | character varying | YES  |     |                                   | 
 qualifications     | text              | YES  |     |                                   | 
 cv_url             | character varying | YES  |     |                                   | 
 specializations    | text              | YES  |     |                                   | 
 text_collaboration | text              | YES  |     |                                   | 
 role_id            | integer           | YES  |     |                                   | 
(9 rows)