相关疑难解决方法(0)

PostgreSQL复合主键

在MySQL中,当我创建复合主键(比如列)时X, Y, Z,所有三列都会自动成为索引.Postgres会发生同样的事吗?

postgresql indexing composite-primary-key

33
推荐指数
1
解决办法
2万
查看次数

自动增量表列

使用Postgres,我试图AUTO_INCREMENT在SQL中自动编号我的主键.但是,它给了我一个错误.

CREATE TABLE Staff   (
  ID        INTEGER NOT NULL AUTO_INCREMENT,
  Name      VARCHAR(40) NOT NULL,
  PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)

错误:

********** Error **********
ERROR: syntax error at or near "AUTO_INCREMENT"
SQL state: 42601
Character: 63
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

sql postgresql types auto-increment database-table

29
推荐指数
1
解决办法
5万
查看次数

安全,干净地重命名在Postgres中使用串行主键列的表?

我知道使用SERIAL主键的PostgreSQL表最终会有一个由PostgreSQL创建的隐式索引,序列和约束.问题是在重命名表时如何重命名这些隐式对象.下面是我尝试在最后通过具体问题解决这个问题.

给出一个像这样的表

CREATE TABLE foo (
    pkey SERIAL PRIMARY KEY,
    value INTEGER
);
Run Code Online (Sandbox Code Playgroud)

Postgres输出

CREATE TABLE foo (
  pkey serial NOT NULL,
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE foo OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

PgAdmin III显示以下作为表的DDL

ALTER table foo RENAME TO bar;
Run Code Online (Sandbox Code Playgroud)

现在重命名表

CREATE TABLE bar (
  pkey integer NOT NULL DEFAULT nextval('foo_pkey_seq'::regclass),
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

Postgres输出

ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;
Run Code Online (Sandbox Code Playgroud)

表格的PgAdmin III …

sql postgresql ddl database-design

19
推荐指数
1
解决办法
2万
查看次数

JSONB使PostgreSQL数组无用吗?

假设您要在对象上存储"标签"(例如,帖子).在9.4版本中,您有3个主要选择:

  • 标签为文本[]
  • 标签为jsonb
  • 标记为文本(并将JSON字符串存储为文本)

在许多情况下,第3个将是不可能的,因为它不允许查询条件为"标签"值.在我目前的开发中,我不需要这样的查询,标签只在帖子列表中显示,而不是过滤帖子.

所以,选择主要是在text[]和之间jsonb.两者都可以查询.
你会用什么?为什么?

arrays postgresql database-design jsonb postgresql-9.4

13
推荐指数
1
解决办法
4224
查看次数

模式迁移:PostgreSQL中的一对多,多对多

背景

在MySQL中,如果我想保持规范化表,我需要使用两个表和多对多三个表来建模一对多.

我正在调查向PostgreSQL的迁移,令人惊讶的是,它允许向量甚至多维向量字段!

问题

有哪些cannonical映射一个一对多多对一许多PostgreSQL的

  • 一个一对多只是一个表矢量场?

  • 有多种方法可以模拟多对多,还是取决于具体情况(比如我需要查询)?

  • 使用数组字段有什么警告吗?

mysql postgresql schema database-migration

6
推荐指数
1
解决办法
9707
查看次数

将多个 INSERTS 插入一张表和多对多表

我正在尝试使用 PostgreSQL 数据库在 PHP 中开发一个问答网站。我有一个操作来创建一个具有标题、正文、类别和标签的页面。我设法插入了所有这些字段,但是在插入多个标签值时遇到了一些问题。

我使用这个函数将逗号分隔的值放入一个数组中,现在我想要将每个数组元素插入到表上的数据库中(避免重复),tags然后插入到我的多对多关系表中questiontags

$tags = explode(',', $_POST['tags']); //Comma separated values to an array
Run Code Online (Sandbox Code Playgroud)

它打印出这样的东西:

Array ( [0] => hello [1] => there [2] => this [3] => is [4] => a [5] => test )
Run Code Online (Sandbox Code Playgroud)

动作/create_question.php

$category = get_categoryID_by_name($_POST['category']);

$question = [
    'userid' => auth_user('userid'),
    'body' => $_POST['editor1'],
    'title' => $_POST['title'],
    'categoryid' => $category
];

create_question($question, $tags);
Run Code Online (Sandbox Code Playgroud)

然后我create_question应该在哪里插入标签。

function create_question($question, $tags) {

    global $conn;
    $query_publications=$conn->prepare("SELECT * FROM insert_into_questions(:body, :userid, :title, :categoryid); …
Run Code Online (Sandbox Code Playgroud)

php database postgresql upsert common-table-expression

6
推荐指数
1
解决办法
1376
查看次数

如何使用array_agg()进行varchar []

我在我们的数据库中有一个名为min_crew具有不同字符数组的列,例如'{CA, FO, FA}'.

我有一个查询,我试图获取这些数组的聚合但没有成功:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
     , array_agg(se.min_crew) 
FROM base.sched_entry se
   LEFT JOIN base.user_sched_entry use ON se.sched_entry_id = use.sched_entry_id
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
Run Code Online (Sandbox Code Playgroud)

623和625都有相同的use.user_sched_id,所以结果应该是seid的分组和min_crew,但我只是不断收到这个错误:

ERROR:  could not find array type for data type character varying[]
Run Code Online (Sandbox Code Playgroud)

如果我删除了array_agg(se.min_crew)代码的一部分,我会得到一个带有user_sched_id = 2131和的表返回seids = '{623, 625}'.

sql arrays postgresql aggregate-functions multidimensional-array

5
推荐指数
1
解决办法
7021
查看次数

LEFT JOIN 跨越三个表(带连接表)

在 Postgres 中,有没有办法left join在由联结表链接的表之间执行 a ,并对链接表进行一些过滤?

比如说,我有两个表humanspets,我想在我有人类 ID 和宠物名称的地方执行查询。如果人类 ID 存在,但他们没有使用该名称的宠物,我仍然希望返回人类的行。

如果我从petsto有 FK 关系humans,这将起作用:

select h.*, p.*
from humans as h
left join pets as p on p.human_id = h.id and p.name = 'fluffy'
where h.id = 13
Run Code Online (Sandbox Code Playgroud)

我会得到一行 13 岁的人的详细信息和蓬松的价值观。此外,如果人类 13 没有名为“fluffy”的宠物,我会得到一行包含人类 13 的值,以及宠物列的空值。

但是,我没有直接的 FK 关系,我在humans和之间有一个连接表pets,所以我正在尝试这样的查询:

select h.*, p.*
from humans as h
left join humans_pets_junction as j on j.human_id = h.id
left …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql many-to-many left-join

5
推荐指数
1
解决办法
1786
查看次数

在 PostgreSQL 中实现多对多关系的最佳方式是什么?

我正在尝试在 PostgreSQL 中实现多对多关系。这是我的数据库中的表:

CREATE TABLE products (
   product_id   serial PRIMARY KEY
 , product_name varchar NOT NULL
);

CREATE TABLE orders (
   order_id   serial PRIMARY KEY
 , order_name varchar NOT NULL
);

CREATE TABLE product_order (
   product_id  int REFERENCES products
 , order_id    int REFERENCES orders
 , PRIMARY KEY (product_id, order_id)
);
Run Code Online (Sandbox Code Playgroud)

products 和orders 表中不会有任何UPDATE 或DELETE,因此不需要ON DELETE 和ON UPDATE 语句。

我还创建了两个哈希索引,以便我可以搜索订单和产品名称并将其 id 存储在表中:

CREATE INDEX product_index ON products USING hash(product_name);
CREATE INDEX order_index ON orders USING hash(order_name);
Run Code Online (Sandbox Code Playgroud)

这就是我想做的:

  1. 我想插入产品表并返回插入行的 id。
  2. 我想插入订单表并返回插入行的 id。 …

sql postgresql database-design many-to-many

4
推荐指数
1
解决办法
2170
查看次数

一个 INSERT 带有多个 SELECT

我已经阅读了thisthisthis,但我无法使这个 SQL 工作:

INSERT INTO main_phrase (description) VALUES ('Mot commun féminin pluriel animaux');
/* ERROR: */
WITH
  t1 AS (
    SELECT id 
    FROM main_phrase 
    WHERE description='Mot commun féminin pluriel animaux'
  ),
  t2 AS (
    SELECT id 
    FROM main_groupecategories 
    WHERE description='Mot commun féminin pluriel animaux'
  )
INSERT 
  INTO main_phrasegroupecategories (phrase_id, groupe_categories_id)
  VALUES                           (t1.id,     t2.id);
Run Code Online (Sandbox Code Playgroud)

我得到:

错误:表 t1 的 FROM 子句缺少条目

我错过了什么?

postgresql many-to-many common-table-expression sql-insert sql-returning

3
推荐指数
2
解决办法
6940
查看次数