【发布时间】:2018-03-06 21:16:21
【问题描述】:
假设我有下表:
CREATE TABLE tags (
id int PK,
name varchar(255),
CONSTRAINT name_unique UNIQUE(name)
)
我需要一个查询来插入不存在的标签并返回所有请求标签的 ID。考虑以下几点:
INSERT INTO tags (name) values ('tag10'), ('tag6'), ('tag11') ON CONFLICT DO NOTHING returning id, name
这个查询的输出是:
+---------------+
| id | name |
|---------------|
| 208 | tag10 |
|---------------|
| 209 | tag11 |
+---------------+
我需要在输出中有tag6。
【问题讨论】:
-
不相关,但是:您是否知道 varchar 列的长度 255 与 254 或 300 相比没有性能或存储优势?
-
@a_horse_with_no_name 更好地解释一下...我来这里只是为了我的业务,但您的评论唤醒了我的好奇心...
-
长度 255 没有内置的“魔法”,如果这是您的想法。没有秘密优化可以使声明为
varchar(255)的列比定义为varchar(300)的列更“有效”。每次我看到“幻数” 255 时,我都会质疑 为什么 选择了这个 - 尤其是 Postgres 在性能 方面绝对没有差异在varchar(1)、varchar(78656)` 和text之间(当您只存储一个字符时)。您需要将长度定义视为业务约束,而不是技术“事物” -
@a_horse_with_no_name 我认为
varchar(255)源于Oracle。 (我似乎确实记得 Postgres 中较小的 varchar 列没有被烘烤) -
@joop:Oracle 从未对
varchar(255)进行过任何优化(至少自 8i 以来没有)。并且决定是否在 Postgres 中烘烤(=压缩)值不是根据列 definition 而是根据存储在其中的值的实际长度来决定的