在MySQL中,当我创建复合主键(比如列)时X, Y, Z
,所有三列都会自动成为索引.Postgres会发生同样的事吗?
使用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)
错误:
Run Code Online (Sandbox Code Playgroud)********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63
知道为什么吗?
我知道使用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 …
假设您要在对象上存储"标签"(例如,帖子).在9.4版本中,您有3个主要选择:
在许多情况下,第3个将是不可能的,因为它不允许查询条件为"标签"值.在我目前的开发中,我不需要这样的查询,标签只在帖子列表中显示,而不是过滤帖子.
所以,选择主要是在text[]
和之间jsonb
.两者都可以查询.
你会用什么?为什么?
背景
在MySQL中,如果我想保持规范化表,我需要使用两个表和多对多三个表来建模一对多.
我正在调查向PostgreSQL的迁移,令人惊讶的是,它允许向量甚至多维向量字段!
问题
有哪些cannonical映射一个一对多和多对一许多在PostgreSQL的?
是一个一对多只是一个表与矢量场?
有多种方法可以模拟多对多,还是取决于具体情况(比如我需要查询)?
使用数组字段有什么警告吗?
我正在尝试使用 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) 我在我们的数据库中有一个名为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
,但我只是不断收到这个错误:
Run Code Online (Sandbox Code Playgroud)ERROR: could not find array type for data type character varying[]
如果我删除了array_agg(se.min_crew)
代码的一部分,我会得到一个带有user_sched_id = 2131
和的表返回seids = '{623, 625}'
.
sql arrays postgresql aggregate-functions multidimensional-array
在 Postgres 中,有没有办法left join
在由联结表链接的表之间执行 a ,并对链接表进行一些过滤?
比如说,我有两个表humans
和pets
,我想在我有人类 ID 和宠物名称的地方执行查询。如果人类 ID 存在,但他们没有使用该名称的宠物,我仍然希望返回人类的行。
如果我从pets
to有 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) 我正在尝试在 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)
这就是我想做的:
我已经阅读了this、this和this,但我无法使这个 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
postgresql ×10
sql ×5
many-to-many ×3
arrays ×2
database ×2
ddl ×1
indexing ×1
jsonb ×1
left-join ×1
mysql ×1
php ×1
schema ×1
sql-insert ×1
types ×1
upsert ×1